Se eu executar history
, posso ver meus últimos comandos executados.
Mas se eu fizer tail -f $HISTFILE
ou tail -f ~/.bash_history
, eles não serão listados.
O arquivo é bloqueado, existe um local temporário ou algo semelhante?
Se eu executar history
, posso ver meus últimos comandos executados.
Mas se eu fizer tail -f $HISTFILE
ou tail -f ~/.bash_history
, eles não serão listados.
O arquivo é bloqueado, existe um local temporário ou algo semelhante?
Respostas:
O Bash mantém a lista de comandos internamente na memória enquanto está em execução. Eles são gravados .bash_history
na saída :
Quando um shell interativo sai, as últimas linhas $ HISTSIZE são copiadas da lista de histórico para o arquivo nomeado por $ HISTFILE
Se você deseja forçar a gravação do histórico de comandos, pode usar o history -a
comando, que irá:
Anexe as novas linhas do histórico (linhas do histórico inseridas desde o início da sessão atual do Bash) ao arquivo do histórico.
Há também uma -w
opção:
Escreva o histórico atual no arquivo do histórico.
o que pode ser mais adequado a você, dependendo exatamente de como você usa seu histórico.
Se você deseja garantir que eles sempre sejam gravados imediatamente, você pode colocar esse comando em sua PROMPT_COMMAND
variável:
export PROMPT_COMMAND='history -a'
(Não é uma resposta, mas não posso adicionar comentários)
Se você estiver verificando .bash_history
porque deseja excluir um comando específico (por exemplo, contendo uma senha em branco), é possível excluir diretamente a entrada na memória por history -d <entry_id>
.
Por exemplo, supondo uma saída como:
$ history
926 ll
927 cd ..
928 export --password=super_secret
929 ll
e você deseja limpar a export
linha, basta alcançá-la:
history -d 928
O bash o mantém na memória de trabalho, o bash pode ser configurado para salvá-lo quando o bash for fechado ou após cada comando e ser carregado quando o bash for iniciado ou mediante solicitação.
Se você configurar para salvar após cada comando, considere as implicações de ter vários bash em execução ao mesmo tempo. (as linhas de comando serão intercaladas)
bash
exetable. Eu escreveria "Ele é armazenado bash
na memória, ..."
Os comandos são salvos na memória (RAM) enquanto sua sessão está ativa. Assim que você fecha o shell, a lista de comandos é gravada .bash_history
antes do desligamento.
Assim, você não verá o histórico da sessão atual em .bash_history
.
bash
finalização, o que não implica reinicialização (especialmente em ambientes gráficos em que você pode abrir e fechar terminais como desejar).
Durante a execução, o histórico é mantido apenas na memória (por padrão) se:
H
in echo "$-"
) está definido.0
e*
(ou algum outro padrão muito restritivo).Se alguma das situações acima falhar, nenhum histórico será armazenado na memória e, consequentemente, nenhum histórico poderá ou será gravado no disco.
O histórico na memória é gravado no disco se:
Mas somente quando o shell sai ou se os comandos history -a
(acrescentar) ou history -w
(gravar) são executados.
Para disparar uma gravação imediata no disco, você pode usar a variável:
PROMPT_COMMAND='history -a'
que alinhará append
o new
histórico com o arquivo de histórico. Essas são as linhas do histórico inseridas desde o início da sessão atual do bash, mas ainda não foram anexadas ao arquivo de histórico.
Ou:
PROMPT_COMMAND='history -w'
Para substituir o histórico no HISTFILE pela lista da memória.
Portanto, você pode remover um comando do histórico na memória:
$ history 5
6359 ls
6360 cd ..
6361 comand --private-password='^%^&$@#)!@*'
6362 top
6363 set +o | less
$ history -d 6361
$ history 5
6359 ls
6360 cd ..
6361 top
6362 set +o | less
$ history -w
E escreva-o no disco com o último comando:
history -w # with `shopt -u histappend` unset
.bash_history
arquivo acidentalmente se torna propriedade da raiz, as coisas param de funcionar. Nesse caso, verifique a propriedade e use-asudo
para corrigir a propriedade, se necessário.