É possível ter histórico bash de diretório ciente

2

Eu não sou o único que usa alguns comandos em alguns diretórios, diferentes em outros diretórios. Quando eu entro em um diretório específico do qual eu executo um script com vários argumentos, eu gostaria de tê-lo no histórico facilmente disponível. Em vez disso, a história é inundada por centenas de outros comandos de diferentes guias e janelas, e é difícil alcançar exatamente o que eu gostaria de executar novamente.

Imagine que você tem um servidor, que você usa para um script muito específico, que o script é lançado com toneladas de argumentos -x this -y that/thing/there.conf -d -g -t also -t more - sempre que você estiver nesse servidor, para usar o script, você vai pressionar algumas vezes e é lá.

Então, existe uma maneira de fazer isso em um sistema, sob um usuário?

    
por iScrE4m 15.12.2016 / 15:21

1 resposta

2

Primeiro de tudo, pode ser mais simples mapear seus botões Up e Abaixo para history-search-backward e history-search-forward , respectivamente. De man bash :

   history-search-forward
          Search  forward through the history for the string of characters
          between the start of the current line and the point.  This is  a
          non-incremental search.
   history-search-backward
          Search backward through the history for the string of characters
          between the start of the current line and the point.  This is  a
          non-incremental search.

Com isto ativado, se começar a digitar o nome do seu comando e depois pressionar Up , apenas os comandos do seu histórico começando com o que você digitou serão mostrados. Dessa forma, você pode rapidamente encontrar o comando no qual está interessado e não precisa mexer nos arquivos de histórico específicos do diretório. Apenas digite s , então Up e somente os comandos que começam com s serão encontrados. Use fooba e somente aqueles que começam com fooba serão mostrados.

Para habilitar isso, adicione as seguintes linhas ao seu arquivo ~/.inputrc no servidor (dependendo do seu emulador de terminal, você pode precisar de um formato ligeiramente diferente. Dê uma olhada na minha resposta aqui se este não funcionar):

"\e[A": history-search-backward
"\e[B": history-search-forward

Dito isto, sim, é possível definir um arquivo de histórico por diretório. Adicione esta função ao seu ~/.profile (não ao seu ~/.bashrc , pois este arquivo não é lido por padrão ao usar ssh para efetuar login em um computador remoto):

 setHistFile(){
    targetDirs=("/home/terdon/foo" "/home/terdon/bar")
    for dir in "${targetDirs[@]}"; do
        if [[ "$dir" = "$PWD" ]]; then
            ## Set the history file name
            export HISTFILE="./.bash_history"
            ## clear current history
            history -c
            ## read history from the $HISTFILE
            history -r
            ## Exit the function
            return
        fi
    done
    ## This will be run if the PWD is not in
    ## the targetDirs array
    export HISTFILE="$HOME/.bash_history"
    ## Read the history (in case we are leaving
    ## one of the targetDirs)
    history -r
}

E, em seguida, defina sua variável PROMPT_COMMAND (esse é um comando executado toda vez que um prompt de shell é mostrado):

export PROMPT_COMMAND='setHistFile'

Altere a matriz targetDirs para a lista dos diretórios que você deseja ter seu próprio arquivo de histórico.

    
por 21.12.2016 / 12:06

Tags