Lembra-se do histórico do bash "local" em uma pasta?

11

Eu tenho um script em uma pasta que eu uso com argumentos longos. Existe alguma chance de eu ter um histórico dos comandos executados nesse diretório específico, em vez de voltar ao histórico inteiro?

Faber
fonte
3
Pergunta interessante. Aliás, ao invés de voltar "ao longo de toda a história", você pode usar Ctrl + R para pesquisar, é o que eu faria em tais situações.
Phk
sim, ajuda, mas dessa maneira eu só tenho o último. Existe alguma possibilidade de obter mais de um resultado?
Faber
1
Você pode continuar pressionando Ctrl + R depois de inserir parte do nome do comando.
mtahmed
history | lesspossivelmente? Realmente não responde à sua pergunta, mas é aí que eu começaria.
roaima
@roaima E depois pesquise usando "/" + termo de pesquisa + insira e, em seguida, "n" / "N" para pesquisar mais adiante / para trás.
Php 26/10

Respostas:

2

Ao conectar-se ao PROMPT_COMMAND do bash, essa função é executada toda vez que você recebe um novo prompt, portanto, é um momento decente para verificar se você está em um diretório para o qual deseja um histórico personalizado. A função possui quatro ramos principais:

  1. Se o diretório atual ( $PWD) não mudou, não faça nada (retorne).

Se o PWD foi alterado, configuramos uma função local cujo único objetivo é fatorar o código do "diretório personalizado" em um único local. Você deseja substituir meus diretórios de teste pelos seus (separados por |).

  1. Se não tivermos mudado para dentro ou fora de um diretório personalizado, basta atualizar a variável "diretório anterior" e retornar à função.

Como alteramos os diretórios, atualize a variável "diretório anterior", salve o histórico da memória no HISTFILE e limpe o histórico da memória.

  1. Se tivermos mudado para um diretório personalizado, defina HISTFILE como um .bash_historyarquivo no diretório atual.

  2. Caso contrário, mudamos de um diretório personalizado, portanto, redefina o HISTFILE para o diretório padrão.

Por fim, como alteramos os arquivos de histórico, leia novamente no histórico anterior.

Para fazer as coisas funcionarem, o script define o valor PROMPT_COMMAND e salva duas variáveis ​​de uso interno (o estoque HISTFILE e o "diretório anterior").

prompt_command() {
  # if PWD has not changed, just return
  [[ $PWD == $_cust_hist_opwd ]] && return

  function iscustom {
    # returns 'true' if the passed argument is a custom-history directory
    case "$1" in
      ( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
      ( * ) return 1;;
    esac
  }

  # PWD changed, but it's not to or from a custom-history directory,
  # so update opwd and return
  if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
  then
    _cust_hist_opwd=$PWD
    return
  fi

  # we've changed directories to and/or from a custom-history directory

  # save the new PWD
  _cust_hist_opwd=$PWD

  # save and then clear the old history
  history -a
  history -c

  # if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
  if iscustom "$PWD"
  then
    HISTFILE=$PWD/.bash_history
  else
    HISTFILE=$_cust_hist_stock_histfile
  fi

  # pull back in the previous history
  history -r
}

PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD
Jeff Schaller
fonte
0

A resposta de Jeff é ótima se você quiser o histórico para um único diretório, mas se estiver bem com a instalação do zsh, poderá usar o diretório per-history para obter um histórico específico ao diretório para todos os diretórios.

Você pode instalar o zsh:

brew install zsh

Como alternativa, se você deseja instalar o oh-my-zsh , você pode adicionar o plug- in histdb e escrever uma consulta personalizada para consultar o banco de dados sqlite que o histdb adiciona. Eu escrevi sobre isso e adicionei conclusões automáticas em uma postagem de Dev Diaries . Verifique a seção de comandos de bônus .

A consulta fica assim

show_local_history() {
    limit="${1:-10}"
    local query="
        select history.start_time, commands.argv 
        from history left join commands on history.command_id = commands.rowid
        left join places on history.place_id = places.rowid
        where places.dir LIKE '$(sql_escape $PWD)%'
        order by history.start_time desc
        limit $limit
    "
    results=$(_histdb_query "$query")
    echo "$results"
}

Isso também aceita um limite opcional:

show_local_history 50

por exemplo.

Khaliq Gant
fonte
-1

Quando preciso usar um comando com argumentos longos várias vezes, geralmente crio um alias no meu ~/.bash_aliasesou você pode colocá-lo no seu, ~/.bashrcse preferir. É fácil e economiza tempo; procure comandos antigos no histórico.

andreatsh
fonte
1
Essa é uma boa dica, mas não o que o OP estava procurando. O OP foi bastante específico para o que ele / ela estava procurando (uma solução que eu também me inscrevia).
Phk
@phk Você está certo, vou ter mais cuidado na próxima vez! Obrigado pela sua explicação!
andreatsh