É possível escrever em .bash_history imediata?

É possível escrever em .bash_history imediata?

Costumo abrir muitos terminais (no momento, tenho sete abertos neste espaço de trabalho) e frequentemente pesquiso historypara grepencontrar um comando que acabei de escrever recentemente, mas não quero procurar o terminal e depois rolar levante-se e cace-o.

Às vezes, meus terminais fecham sem exite tudo o que escrevi neles é perdido. Às vezes, eu precisava de algo que escrevi em um terminal que foi eliminado.

Existe uma maneira de fazer com que cada terminal grave .bash_historyimediatamente? Ou pelo menos uma vez por minuto, ou algo parecido?

Responder1

Uma solução simples é detalhada emAtualizar histórico do Bash em tempo real.

Diz para colocar esses comandos na configuração .bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

O primeiro comando altera o modo do arquivo de histórico para anexar e o segundo configura o history -acomando para ser executado em cada prompt do shell. A -aopção permite historygravar imediatamente as linhas atuais/novas no arquivo de histórico.

Deman bash:

Se a opção histappend shell estiver habilitada (veja a descrição de shopt em SHELL BUILTIN COMMANDS abaixo), as linhas serão anexadas ao arquivo de histórico, caso contrário, o arquivo de histórico será sobrescrito.

Relacionado para Zsh:

Responder2

Tente colocar isso em seu .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Crédito aqui:https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -climpa o histórico da sessão em execução. Isso reduzirá o contador do histórico na quantidade de $HISTSIZE. history -rleia o conteúdo $HISTFILEe insira-o no histórico da sessão em execução atual. Isso aumentará o contador do histórico pela quantidade de linhas no arquivo $HISTFILE.

Acho que isso significa que os comandos estão disponíveis quase imediatamente (você tem um terminal, write echo 1, segundo terminal echo 2, primeiro echo 3e ao pressionar a seta para baixo duas vezes, você deve ter echo 2disponível. Você deve emitir um comando em um determinado terminal para ter acesso ao que tem foi escrito.

Responder3

Eu tenho um grande arquivo de histórico com cerca de 100.000 entradas, e as variantes que limpam a lista de histórico e leem todo o arquivo de histórico (usando history -ce history -r) introduzem um atraso perceptível (talvez 0,2 segundo) antes que o prompt seja exibido. Usar history -npara que apenas novas linhas sejam lidas do arquivo de histórico é mais rápido:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMANDnão precisa ser exportado porque é uma variável shell.

Responder4

Uma observação para todas as outras respostas (que são basicamente a mesma coisa):

Definir-se PROMPT_COMMAND="history -a;$PROMPT_COMMAND"no .bashrc(ou amigos) é o suficiente.

Além disso, você pode executar manualmente history -asempre que desejar "capturar um instantâneo" do histórico na sessão atual.

O comando shopt -s histappendnão é necessário porque history -asempre acrescenta novas linhas ao arquivo e nunca o sobrescreve. Além disso, pelo menos a partir do Bash 4, histappendé o comportamento padrão.

informação relacionada