Como excluir o comando da lista de histórico, mas mantê-lo no histórico "ao vivo"?

3

Enquanto isso, consegui manter minha história muito mais limpa graças às ótimas dicas de vocês que envolvem a opção HISTIGNORE em .bashrc , omitindo todas aquelas inúteis ll ou df -k linhas.

No entanto, aprendi também que a opção HISTIGNORE é muito restritiva também. Por exemplo, se você tem uma linha como essa (simplificada)

HISTIGNORE='ll*:la*:cd*'

você não só fará com que estes sejam excluídos da lista , mas também do seu "histórico ao vivo" como eu gostaria de dublar a história volátil você pode acessar via Cursor para cima / Cursor para baixo . Experimente: eles serão totalmente omitidos agora, não importa quanto tempo você percorra seu histórico de comandos com as teclas do cursor.

No entanto, às vezes eu faço essas linhas, especialmente com caminhos muito longos e complicados que não quero redigitar. Por outro lado, eu gostaria de ter essas linhas exclusivas ao meu histórico ao vivo e não tê-las armazenadas na lista de histórico , pois elas serão alteradas com freqüência.

Existe alguma maneira de conseguir isso?

Como outra nota, descobri que, por algum motivo, o histórico "ao vivo" e a lista de histórico às vezes diferem muito (cf. esta questão relacionada ).

    
por syntaxerror 17.06.2015 / 16:58

1 resposta

1

Você pode usar a variável de ambiente HISTIGNORE .

Uma lista de padrões separados por dois pontos usados para decidir quais linhas de comando devem ser salvas na lista de histórico. Por exemplo:

export HISTIGNORE="cd*:ls*"

isto irá ignorar todos os comandos cd e ls do histórico.

EDITAR:

desculpe, na minha primeira leitura eu não tomei cuidado suficiente para a sua pergunta. Btw, você está certo: HISTIGNORE é uma configuração muito difícil, e bash_history simplesmente irá ignorar cada comando que está listado nesta variável (ela irá ignorá-lo no momento em que você executá-lo, se já houver entradas com esse comando em seu HISTFILE eles serão encontrados pela pesquisa reversa do histórico.

Para responder primeiro à sua última pergunta, a história escrita e ao vivo pode variar muito se você usar terminais diferentes simultaneamente. Você poderia tentar uma solução conforme descrito aqui:

Preserve o histórico bash em várias janelas de terminal

O que você pode imaginar é uma solução na qual você usa uma função em seu arquivo ~/.bash_logout , que apagará as entradas do histórico que você não deseja.

algo como isso deve fazer o que você quer:

 function clear_history(){
    # hist_ignore regex, this may be done in a more fancy way, 
    # such as using an env variable, but anyway
    MYHISTIGNORE='^cd:^view:^cat'

    # write down history to file
    history -w

    # create a new tmp file for history
    tmpFile=$(mktemp)
    cp ${HISTFILE}  ${tmpFile}

    # use it to filter history
    for myRegex in $(echo $MYHISTIGNORE | awk 'BEGIN{FS=":"}{for (i=1;i<=NF;i++){print $i}}'); do 
       sed -i "/${myRegex}/d" ${tmpFile}
    done

    # and copy it back to history file
    mv ${tmpFile} ${HISTFILE}
}
    
por 17.06.2015 / 17:07