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 history
comando 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 $var
algo 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 HISTFILE
valor 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 $HISTFILE
variável para o seu script e cat
que:
#!/bin/bash
cat "$1" > history
Salve o acima foo.sh
e 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_profile
não existir):
export HISTFILE
Em seguida, efetue logout e logon novamente e você poderá executar a history > hist.txt
partir de um script conforme o esperado. Isso ocorre porque export VAR
significa "disponibilizar o $ VAR para conchas filho". Em termos práticos, isso significa que o valor de HISTFILE
será herdado pelo shell não interativo que você usa para executar seu script.
Agora, enquanto o HISTFILE
será definido, ele não foi lido pelo shell executando o script. Portanto, para que funcione, você precisa history -r
primeiro 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 -r
no script.
Você pode source
sugerir a resposta de @ p0llard .