Eu sei que esta pergunta não é obscura, pois é solicitada aqui, continue atualizando (e duplicada aqui).
O que estou tentando alcançar é um pouco diferente. Não gosto da ideia de reescrever um arquivo a cada ls
digito ( history -a; history -c; history -r
).
Gostaria de atualizar o arquivo na saída. Isso é fácil (na verdade, padrão), mas você precisa anexar em vez de reescrever:
shopt -s histappend
Agora, quando um terminal estiver fechado, gostaria de deixar todos os outros que permanecem abertos para conhecer a atualização.
Eu prefiro fazer isso sem verificar via $PS1
todos os command
que eu digito. Eu acho que seria melhor capturar algum tipo de sinal. Como você faria isso? Se não for possível, talvez um simples cronjob
?
Como podemos resolver esse quebra-cabeça?
bash
shell
command-history
signals
Dr Beco
fonte
fonte
bash
. Talvez seja hora de verificar algo novo, apenas por diversão.Respostas:
Sinais criativos e envolventes, você diz? ESTÁ BEM:
Coloque isso
.bashrc
e vá embora. Isso usa sinais para dizer a cadabash
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. OEXIT
evento é qualquer terminação controlada do shell, enquantoUSR1
éSIGUSR1
um sinal sem sentido que estamos nos apropriando.Sempre que o shell sai, nós:
SIGUSR1
manipulador e faça esse shell ignorar o sinal.bash
processos em execução do mesmo usuário.Quando
SIGUSR1
chega, nós: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 colocarPROMPT_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 outrosbash
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 porBASH_ENV
é carregado : você pode definir essa variável em seu ambiente globalmente para apontar para um arquivo com: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.
fonte
.bashrc
arquivo e, em seguida, apareceu algo como um cronjob e recorreu ao arquivo periodicamente, enviando umSIGUSR1
trecho conforme o seu caso, se você poderia recuperar o histórico cronológico da seta para cima?linux bug
?? Por que outro processo está pegando USR1? (Eu sei que não pretende ser discutido aqui, mas talvez eu vou trazer isso para a luz no lugar correto)BASH_ENV
como indicado nesta resposta? Ou você conhece uma maneira mais padrão de desligar esse mal?