Antes de tudo, observe que seu histórico já está em um arquivo. Se você estiver executando o bash, seu nome geralmente é ~/.bash_history. Mais especificamente, é como você definiu a variável HISTFILE. Se você deseja copiá-lo para outro arquivo, basta executarcat "$HISTFILE" > hist.txt
Agora, por que o historycomando não funciona em um script shell bash, é porque os scripts são executados em um shell filho não interativo da sua sessão atual do shell. Os shells filhos não herdam todo o ambiente do pai (portanto, nem todas as variáveis definidas), apenas as variáveis que foram exportadas. Para ilustrar, o script abaixo fará eco do valor da variável $var:
#!/bin/bash
echo "$var"
Agora, defina $varalgo e execute o script:
$ var="foo"
$ foo.sh
VAR:
Em seguida, exporte a variável primeiro:
$ var="foo"
$ export var
$ foo.sh
VAR: foo
Como você pode ver, quando a variável foi exportada, ela está disponível para shells filhos.
Como mencionei antes, o histórico é armazenado no arquivo apontado pela variável $HISTFILENAME. Como isso não é exportado por padrão, ele não é definido ao executar um script:
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
Como você pode ver no exemplo acima, a variável HISTFILEé definida na minha sessão normal do shell, mas fica vazia ao executar o script.
Portanto, para obter o histórico, você tem algumas opções:
O HISTFILEvalor padrão é $HOME/.bash_history. Se você não mudou isso, basta executar este comando no seu script:
cat "$HOME/.bash_history" > history
Você pode passar a $HISTFILEvariável para o seu script e catque:
#!/bin/bash
cat "$1" > history
Salve o acima foo.she execute assim:
./foo.sh "$HISTORY"
Verifique se a variável é exportada. Adicione esta linha aos seus arquivos ~/.bash_profile(se existir) ou ~/.profile(se ~/.bash_profilenão existir):
export HISTFILE
Em seguida, efetue logout e logon novamente e você poderá executar a history > hist.txtpartir de um script conforme o esperado. Isso ocorre porque export VARsignifica "disponibilizar o $ VAR para conchas filho". Em termos práticos, isso significa que o valor de HISTFILEserá herdado pelo shell não interativo que você usa para executar seu script.
Agora, enquanto o HISTFILEserá definido, ele não foi lido pelo shell executando o script. Portanto, para que funcione, você precisa history -rprimeiro ler . O script inteiro ficaria assim:
$!/bin/bash
history -r
history > hist.txt
Como alternativa, basta exportá-lo manualmente antes de executar o script:
$ export HISTFILE
Mas você ainda precisará history -rno script.
Você pode sourcesugerir a resposta de @ p0llard .