Usei a resposta em /unix//a/1292/41729 para ativar o histórico compartilhado em tempo real entre terminais bash separados. Conforme explicado na resposta acima, isso é alcançado adicionando:
# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups
# append history entries..
shopt -s histappend
# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
Isso funciona bem se os shells do bash estiverem separados (por exemplo, abrir diferentes terminais do bash usando CTRL+ALT+T
. No entanto, não funcionará se eu usar tabs
(a partir de um terminal aberto `CTRL + SHIFT + T) em vez de novas janelas. Por que essa diferença de comportamento? posso compartilhar o histórico do bash também entre várias guias?
ATUALIZAÇÃO: Percebi um comportamento incomum: se eu digitar CTRL+C
, o último comando digitado em qualquer um dos outros terminais (uma guia ou não) será exibido corretamente. É como se CTRL + C force uma descarga do histórico para que seja compartilhada corretamente.
Como exemplo, as saídas (T1 denota o terminal 1 e o terminal 2 do T2):
T1:
ls -lah <enter>
# the list of files and directory is shown
T2:
cd Documents <enter>
T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed
Espero que isso possa oferecer alguma dica!
~.bashrc
arquivo? Em uma nota lateral, exportar essas variáveis é inútil; apenas desperdiça espaço no ambiente.Respostas:
Parece que você está tentando acessar o histórico do outro terminal antes da sincronização.
PROMPT_COMMAND
é executado imediatamente antes da impressão de um novo prompt, ou seja, depois de executar um comando e antes de digitar o próximo comando. Portanto, isso não acontecerá imediatamente em T1; você precisa fazer com que um novo prompt seja exibido.Para testar isso, tente esta variante em suas etapas (adicionei um extra
<enter>
no T1):Com esse pressionamento extra de enter, você recebe um novo prompt, que executa
PROMPT_COMMAND
e sincroniza seu histórico, e, portanto, espero que essa seta para cima recupere o emcd
vez dels
, como você queria. Infelizmente, não acho que exista uma maneira de fazer a sincronização instantaneamente em todos os terminais sem executar nenhum comando que você queira; efetivamente, isso exigiria que todas as suas sessões de login sincronizassem suas listas de histórico continuamente o tempo todo, o que seria um enorme desperdício de CPU e taxa de transferência de disco.fonte
Eu fiz a mesma pergunta e aqui está a resposta que eu vim com ....
fonte
HISTFILESIZE
é alterado, ele tenta automaticamente truncar o arquivo de histórico existente. A mudançaHISTSIZE
tem um efeito semelhante no histórico atual. Para referência, consulte o comentário novariables.c
bash src logo antessv_histsize
.adicione essas linhas ao seu
.bashrc
arquivoNota:
Inicialmente, eu fiz meu teste enviando sinal USR1 para bater com killall, depois pensei em usar um nome de shell exclusivo, uma cópia de bash chamada testshell, para evitar matar meus próprios shells que poderiam ser executados (processos cron, por exemplo), mas estranhamente isso não era possível. trabalhando.
O killall não era seletivo o suficiente, substituí-o por um script que mata apenas os processos do bash em um tty (
ps a
relata apenas processos vinculados a um tty)Não se esqueça de reiniciar sua sessão para ter um novo PROMPT_COMMAND, quando eu estava testando, vi muitos dos meus testes anteriores empilhados dentro de PROMPT_COMMAND.
fonte
killall
para enviar o sinal apenas para processos do mesmo usuário com um-u
argumento adicional, e.g.
-u $ (whoami) `.killall -q -USR1 -u $(whoami) bash
envia o sinal USR1 para todos os processos do bash do usuário atual.Eu tive o mesmo comportamento estranho em Yakuake quando tentei criar um prompt de bash elaborado que mostraria o número de outros logins. O número não aumentou para guias. Minha solução alternativa foi dizer ao Yakuake para executar
bash
novamente em cada nova guia, iniciando basicamente o bash no bash. Começou a funcionar perfeitamente. Pode ser que também o ajudasse. Meu palpite cego é que a GUI do console carrega o bash e se alimenta das instâncias do bash. Pode ser que seja capaz de mexer com eles.fonte