Histórico ilimitado de Bash [fechado]

350

Quero que meu .bash_historyarquivo seja ilimitado. Por exemplo, para que eu possa sempre voltar e ver como eu construí / configurei algo, ou qual foi o comando bacana, ou como algum comando quebrou algo semanas atrás. Como altero essa configuração?

Francis Haart
fonte
11
Bash é uma linguagem de programação e não se trata de programação?
NeilG 22/09/19

Respostas:

307

Defina HISTSIZEe HISTFILESIZEem .bashrc como uma sequência vazia:

HISTSIZE= 
HISTFILESIZE=

No bash 4.3 e posterior, você também pode usar HISTSIZE=-1 HISTFILESIZE=-1:

n.  Setting HISTSIZE to a value less than zero causes the history list to be
    unlimited (setting it 0 zero disables the history list).

o.  Setting HISTFILESIZE to a value less than zero causes the history file size
    to be unlimited (setting it to 0 causes the history file to be truncated
    to zero size).
Lri
fonte
12
(exportar PROMPT_COMMAND = 'history -a') pode liberar comandos para bash o histórico imediatamente.
cruelcage
3
Definir HISTSIZE= HISTFILESIZE=resulta em desabilitar completamente o histórico do bash, pelo menos para mim.
Philipp Ludwig
5
A configuração @PhilippLudwig HISTSIZE=-1 HISTFILESIZE=-1desabilitou meu histórico, enquanto HISTSIZE= HISTFILESIZE=fazia o truque. CentOS 7 aqui.
Seether 21/07
11
@PhilippLudwig Eu acho que, em vez de HISTSIZE= HISTFILESIZE=você deveexport HISTSIZE= export HISTFILESIZE=
Matzz
3
@Seether A resposta afirma claramente "No bash 4.3 e posterior ...". O CentOS 7 possui o bash 4.2.x.
villapx
426

Depois de várias iterações grandes e feias e casos extremos estranhos ao longo dos anos, agora tenho uma seção concisa do meu .bashrc dedicado a isso.

Primeiro, você deve comentar ou remover esta seção do seu .bashrc (padrão para Ubuntu). Caso contrário, determinados ambientes (como screensessões em execução ) ainda truncarão seu histórico:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

Segundo, adicione isso na parte inferior do seu .bashrc:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# http://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Nota: todos os comandos são gravados imediatamente após a execução; portanto, se você colar acidentalmente uma senha, não poderá simplesmente "matar -9 %%" para evitar a gravação do histórico, será necessário removê-la manualmente.

Observe também que cada sessão do bash carregará o arquivo de histórico completo na memória, mas mesmo se o arquivo de histórico aumentar para 10 MB (o que levará muito, muito tempo), você não notará muito efeito no tempo de inicialização do bash.

fotinakis
fonte
11
@AquariusPower - Experimente o que é exatamente acima, fazer o HISTFILESIZE=e HISTSIZE=branco em vez de -1, e certifique-se que você não tem quaisquer outras declarações desses parâmetros em uma .bashrc ou .bash_profile ou .profile.
Fotinakis 17/06
2
culpado de .bashrc, eu tinha essa configuração depois em outro arquivo carregado por .bashrc ..., agora trabalhando! valeu!
Poder de Aquário
10
Adicioná-lo no meu sistema do bash padrão, e adicionando história atual também é bom, então depois de configuração, prazocat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud
2
Para manter o histórico do histórico, inicialize o arquivo do histórico com o seu histórico atual.
26315 Arthur
3
Muito obrigado - o fato de que a configuração HISTFILESIZE(e possivelmente HISTSIZE) terá efeito imediato não pode ser enfatizado demais .
Attie
37

Como Jörg Beyer mencionou acima, HISTSIZEeHISTFILESIZE são fundamentais.

Além disso, você deve definitivamente verificar a variável ambiental HISTCONTROL, que permite fazer coisas legais, como não armazenar comandos duplicados do histórico ( HISTCONTROL=erasedups). Não há nenhum ponto em ter histórico ilimitado se você precisar navegar por centenas de linhas decd .. ou similares.

Links: aqui , e trabalhando com o histórico do bash . Também vale a pena navegar nas Perguntas frequentes sobre o bash Variable .

simont
fonte
13
Essas linhas de cd fornecem contexto para os comandos emitidos. Eles são realmente incrivelmente úteis. Não consigo entender por que alguém iria querer excluí-los, a menos que a única maneira de você usar o histórico seja paginando por ele um comando por vez.
Iconoclast
@simont Eu também uso a opção ignorespace com HISTCONTROL e depois a uso para qualquer coisa que não queira que seja gravada no histórico, como senhas.
Bigtunacan 6/11
6
Manter as linhas em ordem é muito útil se você reutilizar seqüências de comandos. Por exemplo, alguns Ctrl-rcarros Ctrl-o Ctrl-o Ctrl-o Ctrl-o. É por isso que mantenho duplicatas na história.
Stéphane Gourichon
11
@ StéphaneGourichon para que serve Ctrl-o?
Ciprian Tomoiagă 26/09/18
4
O @ CiprianTomoiagă Ctrl-oexecuta o comando no prompt e mostra imediatamente o comando logo após o anterior no histórico. Um benefício é que, depois de usar Ctrl-rpara encontrar um comando antigo (possivelmente usando as setas para cima e para baixo para passar para comandos vizinhos no histórico), basta manter Ctrlpressionado e pressionar ovárias vezes para executar novamente uma série anterior de comandos, mesmo em loop infinito se você quiser. Veja também GNU Readline - Wikipedia
Stéphane Gourichon
22

Existem (pelo menos) dois envios relevantes aqui:

  • HISTSIZE: o número de entradas no arquivo de histórico
  • HISTFILESIZE: o número de linhas no arquivo de histórico

Acho que podemos concordar que o termo ilimitado geralmente é o mesmo que muito grande (ou você tem armazenamento ilimitado de arquivos?). Então, basta definir os valores muito grandes.

Jörg Beyer
fonte
23
"Note-se que 1000000000 é apenas igual ao infinito para valores muito pequenos do infinito. - sepp2k" lol. sim, estou satisfeito com pequenos valores de infinito (digamos, um mês de uso frequente do terminal).
Francis Haart
6
um mês de uso terminal frequente é uma fração infinitamente pequena do infinito. Eu diria que uma vida útil de uso terminal frequente equivale a um valor muito, muito, muito pequeno, do infinito. Mas uma vida inteira de uso frequente de terminal é boa o suficiente para o meu histórico de shell. ;)
iconoclast
2
As versões mais antigas do zsh pelo menos travam se você definir HISTSIZE e / ou HISTFILESIZE muito grandes porque ele tenta pré-alocar memória suficiente. Isso se tornou relevante ao executar ferramentas que usam zsh como shell (dbx por exemplo).
Brian Vandenberg