Entradas pegajosas no histórico do shell

4

Existe alguma maneira de tornar alguns comandos "fixos" em um histórico de shell?

Eu quero salvar alguns comandos favoritos que podem ser pesquisados com Ctrl + R, como o resto do histórico, mas eles nunca devem expirar.

    
por WGH 22.01.2016 / 21:20

4 respostas

3

Uma maneira simples é colocar o código em seu arquivo de inicialização do shell para ler um arquivo de histórico adicional e certificar-se de que você armazena muitas linhas de histórico na memória para que as linhas fixas não sejam esquecidas.

bash

Em ~/.bashrc :

history -r ~/.bash_history.sticky

Verifique também se HISTSIZE é pelo menos HISTFILESIZE mais o número de linhas em ~/.bash_history.sticky mais o número de comandos executados em uma sessão longa, por exemplo

HISTFILESIZE=1000
HISTSIZE=10000

Se você quiser garantir que as entradas do histórico fixo permaneçam na memória sem ter um HISTSIZE muito grande, você pode fazê-lo cortando manualmente o histórico em PROMPT_COMMAND com history -d , mas é difícil acertar se você tem erasedups em HISTCONTROL .

zsh

Em ~/.zshrc :

fc -RI ~/.zsh_history.sticky

Verifique também se HISTSIZE é pelo menos SAVEHIST mais o número de linhas em ~/.zsh_history.sticky mais o número de comandos executados em uma sessão longa, por exemplo

SAVEHIST=1000
HISTSIZE=10000

Se você quiser garantir que as entradas do histórico fixo permaneçam na memória sem ter um HISTSIZE muito grande, você pode fazê-lo cortando manualmente o histórico em precmd , mas é trabalhoso (o zsh não suporta realmente a reescrita histórico, você tem que fc -W em um arquivo temporário e ler de volta uma versão editada) e difícil de acertar se você tiver a opção hist_ignore_dups ou hist_ignore_all_dups definida.

    
por 25.01.2016 / 00:15
1

Minha solução é uma tarefa cron e um grande número de linhas no arquivo * sh_history

no final do dia, esta entrada do cron é executada (a minha está definida para as 11 da noite)

0 23 * * * cat /home/username/.bash_history >> /home/username/BIGHISTORY

Se o comando sticky sair do buffer normal de rolagem do histórico, eu posso encontrá-lo no arquivo BIGHISTORY com um simples comando grep e trazê-lo de volta à dobra. Eu sei que isso não é o que você está procurando, mas esta é a versão do homem pobre, que vem mais perto com o mínimo de esforço.

    
por 22.01.2016 / 21:45
1

Em bash (não sabe sobre zsh ), você pode definir

export HISTFILESIZE=-1
export HISTSIZE=-1

no seu .bashrc para fazer sua história para sempre. Não é exatamente o que você está procurando, eu sei. Para seus comandos favoritos, sugiro criar aliases ou funções.

    
por 22.01.2016 / 21:46
0

No Zsh, mantenho o histórico por um tempo longo . O HISTSIZE é 20000 . (Há várias configurações envolvidas nisso, então eu não vou listá-las aqui). Isso me compra ~ 10 meses no valor. Meu arquivo de histórico ( ~/.zhistory ) pesa 1,1 MB e não torna a inicialização visivelmente mais lenta.

Eu costumo puxar o histórico de trabalho de outros terminais com fc -R (quando os múltiplos estão abertos - sempre).

Mas para responder à sua pergunta, eu "carimbo" os comandos que realmente me importo em salvar com um comentário # GOOD no final. Estes são frequentemente demorados e duramente conquistados, depois de muita experimentação. Alguns deles acabam se tornando scripts pouco reutilizáveis, mas um selo é a maneira mais rápida de salvá-lo. Com o longo histórico, posso fazer uma pesquisa de histórico por # GOOD e geralmente obter o que estou procurando rapidamente.

    
por 23.01.2016 / 00:56