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 .bashrce vá embora. Isso usa sinais para dizer a cada bashprocesso que verifique novas entradas no histórico quando outra sair. Isso é horrível, mas realmente funciona.
Como funciona?
trapdefine um manipulador de sinal para um sinal do sistema ou para um dos eventos internos do Bash. O EXITevento é qualquer terminação controlada do shell, enquanto USR1é SIGUSR1um sinal sem sentido que estamos nos apropriando.
Sempre que o shell sai, nós:
- Anexe todo o histórico ao arquivo explicitamente.
- Desative o
SIGUSR1manipulador e faça esse shell ignorar o sinal.
- Envie o sinal para todos os
bashprocessos em execução do mesmo usuário.
Quando SIGUSR1chega, 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 -nem 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 bashprocessos (executando scripts de shell, por exemplo) serão eliminados. .bashrcnã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.