Como sincronizar o histórico de comandos da sessão do terminal no bash?


13

Tentei procurar ~/.bash_historymeus comandos recentes em uma sessão de terminal, mas eles simplesmente não estavam lá. Acho que é porque tenho várias sessões de terminal abertas.

Existe uma maneira de sincronizar (por exemplo, sync-push ou sync-write-out) o histórico de comandos da sessão atual do terminal no arquivo bash_history (sem fechar a sessão e perder esse ambiente)?

(Seria remotamente semelhante à idéia de como o synccomando armazena as modificações do sistema de arquivos em alguns sistemas.)

Eu imagino que eu poderia configurar o bash para preservar o histórico de várias sessões, mas a capacidade de enviar o buffer do histórico atual ainda seria útil em cenários quando você estiver trabalhando em uma nova máquina e acidentalmente se esqueceu de configurá-lo da maneira que desejaria .


Eu tentei o history -a comando shell builtin, mas de alguma forma agora recebo 'permissão negada' no .bash_historyarquivo, depois disso.
N611x007

Respostas:


19

Adicione esta linha a .bashrc:

export PROMPT_COMMAND="history -a; history -n"

Abra o novo terminal e verifique.

Explicação

  • history -a anexa novas linhas de histórico ao arquivo de histórico.
  • history -ninforma bashpara ler linhas que não são lidas do arquivo de histórico para a lista de histórico atual da sessão.
  • PROMPT_COMMAND: o conteúdo dessa variável é executado como comando regular antes do bashprompt de show. Portanto, toda vez que você executa um comando, history -a; history -né executado e seu bashhistórico é sincronizado.

obrigado! Não sei por que recebi permissão negada antes, mas com novos terminais agora isso parece funcionar como esperado! Eu acho que normalmente deveria ser capaz de usar também history -aem um terminal com bashrc não modificado.
N611x007

quando é preciso começar a se preocupar com as implicações de desempenho disso? (Eu estou pensando em dispositivos low-end, não tenho certeza como grande sobrecarga Isso faz.)
n611x007

1
Além disso, você já pode ter um prompt de comando, neste caso, é melhor usarexport PROMPT_COMMAND="${PROMPT_COMMAND};history -a; history -n"
Fabian

Se ${PROMPT_COMMAND}é esvaziar isto dá um erro por causa da liderança;
Boris Dappen

@ BorisDäppen é certo, mas isso é facilmente remediadoexport PROMPT_COMMAND="${PROMPT_COMMAND}${PROMPT_COMMAND:+;}history -a; history -n"
TML
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.