Se um bash shell for aberto, será passado o conteúdo do arquivo de histórico. Quando sai, anexa seu histórico ao arquivo de histórico.
Se você abrir outro bash shell (interativo) (na mesma janela de terminal), executar alguns comandos ou apenas exit
, os comandos (ou apenas exit
) serão anexados ao arquivo de histórico.
Se, no entanto, você executar um sub-shell não interativo, o histórico será desativado e a variável de ambiente HISTFILE
não será definida.
Você pode verificar isso executando (bash -c 'echo x$HISTFILE')
ou apenas bash -c 'echo x$HISTFILE'
. Isso somente ecoará x
, provando que a variável HISTFILE
não está definida no sub-shell. (Eu adicionei somente o x
para ter alguma saída visível do comando echo).
(O motivo para bash -c
e o único as cita para impedir a expansão da variável shell no shell pai. Se você executar (echo x$HISTFILE)
, a expansão da variável shell passará o valor de HISTFILE
para o sub-shell, que em seguida, echos, fazendo com que pareça que está definido no sub-shell).
Portanto, ao executar um sub-shell, o histórico é desativado e a variável HISTFILE
não é definida. Quando a subchave sai, nada é acrescentado ao histórico. Isso é exatamente o que você está vendo.
Você pode forçar o sub-shell a gravar seu histórico no arquivo de histórico:
$ history -w # write current history
$ wc -l $HISTFILE # count lines in history file
32 /home/anyuser/.bash_history
$ bash -c 'export HISTFILE=~/.bash_history'
$ wc -l $HISTFILE
32 /home/anyuser/.bash_history
$ bash -c 'export HISTFILE=~/.bash_history;history -w'
$ wc -l $HISTFILE
0 /home/anyuser/.bash_history
O último comando sub-shell (aquele com history -w
) sobrescreve o arquivo histórico existente com o histórico do sub-shell, que está vazio porque o histórico está desativado em um sub-shell não interativo.