Manuseio do histórico do Bash com vários terminais


110

Eu uso principalmente o Terminator, e geralmente é aberto com 3 janelas de terminal divididas. Eu também uso o terminal Gnome por várias razões.
Estou me perguntando como o histórico do bash é tratado nesse caso, pois às vezes sinto falta de comandos emitidos anteriormente quando executohistory

Por exemplo, meu prompt mostra a linha atual do histórico do bash ( \!) e, se eu iniciar o Terminator com 3 janelas de terminal divididas, recebo a mesma linha do histórico (digamos 100) em todos os terminais. Qual histórico será salvo?

Também iniciando o Gnome Terminal depois de usar o Terminator, recebo a linha 100 na inicialização, independentemente de todos os comandos emitidos anteriormente no Terminator


Respostas:


107

A sessão do bash salva é a do terminal que está fechado mais recentemente. Se você quiser salvar os comandos para cada sessão, use o truque explicado aqui .

export PROMPT_COMMAND='history -a'

Para citar a página de manual: “Se definido, o valor é executado como um comando antes da emissão de cada prompt primário.”

Portanto, toda vez que meu comando é concluído, ele anexa o item de histórico não escrito ~/.bash_historyantes de exibir o prompt (apenas $ PS1) novamente.

Então, depois de colocar essa linha /etc/bash.bashrc, não preciso me reinventar ou perder segundos valiosos ao digitar novamente as coisas só porque estava com preguiça dos meus terminais.

De qualquer forma, você precisará levar em consideração que os comandos de diferentes sessões serão misturados no seu arquivo de histórico, para que não seja tão simples lê-lo mais tarde.

Veja também:


não é armazenado separadamente para diferentes TTL?
Vineet Menon

Excelente. Obrigado pela explicação e solução. Eu tentei export PROMPT_COMMAND='history -a; history -r'e obtive alguns números estranhos da linha do histórico no terminal - depois de emitir alguns saltos do número da linha do histórico de comandos em 2000, em vez de 1, o que é estranho, mas se comporta como foi dito - todo o histórico dos terminais é salvo.
Zetah

@VineetMenon Para mais detalhes, veja aqui . Partes interessantes: Quando o shell é iniciado, o histórico é inicializado a partir do arquivo nomeado pela variável HISTFILE (padrão `~ / .bash_history '). [...] Quando um shell interativo sai, as últimas linhas $ HISTSIZE são copiadas da lista de histórico para o arquivo nomeado por $ HISTFILE.
jcollado



32

Após várias leituras de man bash, uso arquivos de histórico separados para cada shell. Eu fiz um mkdir -m 0700 ~/.historyentão adicionado

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

para o meu ~/.bashrc. De vez em quando, lembro-me de du -sk .historylimpá-lo. É bom ter todos os comandos que eu digitei preservados para mim.

Eu apenas usei o acima para ver o que eu estava fazendo ultimamente:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
ou
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(para incluir o 1º argumento, por exemplo, sudo mountna cadeia de classificação).


3
Por que você atribui HISTFILESIZEduas vezes?
Daniel

2
Ao definir HISTFILESIZE como 0, limpe o buffer do histórico e redefino o mecanismo de salvamento do histórico. Depois, defino o tamanho que realmente desejo e começo a salvar o histórico no HISTFILE. Veja a seção HISTÓRICO de man bash.
waltinator

11
existe uma maneira de mesclar os arquivos de histórico para fazer o Ctrl+rtrabalho novamente?
N611x007

3
Esta deve ser uma nova pergunta, mas não acho que seja uma boa ideia. Eu uso egrep 'whatever' .history/*(ou cat .history/* | egrep 'whatever') em vez disso e use Ctrl-r para pesquisar o histórico de uma sessão individual. Leia man bash-builtinssobre o comando history. Meu sort .history/* | uniq -c | sort -n | wc -lmostra 16033 comandos únicos, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nmostra 2004 comandos únicos, principalmente erros de digitação. Carregar tudo isso na "lista de histórico" do bash não ajudaria.
waltinator

@ waltinator - eu sei que esse é um comentário antigo, mas você está implicando que definir uma variável de ambiente de alguma forma desencadeia uma ação imediata? que processo vai captar o fato de você atribuir um valor de 0 a HISTFILESIZE em um shell local e depois mudar imediatamente para 4096? isso é algo não documentado sobre o manuseio do bash de certos nomes de variáveis?
não sincronizado

8

Para mostrar historyde todos os terminais:

Adicione export PROMPT_COMMAND='history -a; history -r'ao seu arquivo .bashrc.

Fonte: http://nouthernmost.org/blog/flush-bash_history-after-each-command



3
Vou dizer que, depois de alguns meses de uso, acabei comentando isso recentemente. É agridoce, pois nem sempre eu quero peneirar os últimos 100 comandos apenas para executar o que eu havia originalmente executado no painel Tmux. Às vezes, posso ter um comando de log dedicado em que preciso reiniciar.
Elijah Lynn

Uma boa solução que a concha de peixe oferece é a history --merge. Estou usando isso há mais ou menos um ano e resolve o problema. Quando quero o histórico mais recente de outras sessões, apenas executo esse comando e ele está disponível para mim instantaneamente.
Elijah Lynn

a exportação não é necessária.
Expiação Limitada

6

Consulte também " mantendo o histórico persistente no bash " para outra alternativa. Ele solicita que você envie todos os comandos já digitados em qualquer terminal para um arquivo "histórico persistente" (ao lado do que geralmente é feito para o regular .history).


11
Eu inseri $$ para fazer a linha. echo $$ $date_part "$command_part" >> ~/.persistent_historyIsso prefixa as entradas com os PIDs do processo do bash, para que possamos separar vários históricos.
Evgeni Sergeev 29/03

O histórico alternativo pode ser criado para funcionar com a pesquisa de histórico CTRL-R?
máximo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.