Sinais criativos e envolventes, você diz? ESTÁ BEM:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Coloque isso .bashrc
e vá embora. Isso usa sinais para dizer a cada bash
processo que verifique novas entradas no histórico quando outra sair. Isso é horrível, mas realmente funciona.
Como funciona?
trap
define um manipulador de sinal para um sinal do sistema ou para um dos eventos internos do Bash. O EXIT
evento é qualquer terminação controlada do shell, enquanto USR1
é SIGUSR1
um sinal sem sentido que estamos nos apropriando.
Sempre que o shell sai, nós:
- Anexe todo o histórico ao arquivo explicitamente.
- Desative o
SIGUSR1
manipulador e faça esse shell ignorar o sinal.
- Envie o sinal para todos os
bash
processos em execução do mesmo usuário.
Quando SIGUSR1
chega, nós:
- Carregue todas as novas entradas do arquivo de histórico na lista de histórico de memória do shell.
Por causa da maneira como o Bash lida com os sinais, você não obterá os novos dados do histórico até chegar Enterna próxima vez, para que isso não funcione melhor nessa frente do que history -n
em colocar PROMPT_COMMAND
. No entanto, economiza a leitura constante do arquivo quando nada aconteceu, e não há nenhuma gravação até que o shell saia.
No entanto, ainda existem alguns problemas aqui. A primeira é que a resposta padrão SIGUSR1
é finalizar o shell. Quaisquer outros bash
processos (executando scripts de shell, por exemplo) serão eliminados. .bashrc
não é carregado por shells não interativos. Em vez disso, um arquivo nomeado por BASH_ENV
é carregado : você pode definir essa variável em seu ambiente globalmente para apontar para um arquivo com:
trap '' USR1
nele para ignorar o sinal neles (o que resolve o problema).
Finalmente, embora isso faça o que você pediu, a encomenda que você recebe será um pouco incomum. Em particular, pedaços do histórico serão repetidos em diferentes ordens, à medida que forem carregados e salvos separadamente. Isso é essencialmente inerente ao que você está pedindo, mas lembre-se de que o histórico da seta para cima se torna muito menos útil nesse momento. As substituições da história e similares serão compartilhadas e funcionarão bem.