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 .

n611x007
fonte
Eu tentei o history -a comando shell builtin, mas de alguma forma agora recebo 'permissão negada' no .bash_historyarquivo, depois disso.
N611x007
Pergunta duplicada. Veja: unix.stackexchange.com/questions/1288/…
Eduardo Leggiero

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.
cuonglm
fonte
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