Existe algum utilitário ou plugin que inclua o diretório atual no histórico do bash?

4

Será muito útil para o histórico bash exibir o diretório de trabalho no qual os comandos foram executados. A história é boa para ver o que você fez, mas pode ser difícil dizer onde você estava fazendo isso.

Existe algum desses plugins ou utilitários, ou pode ser configurado para adicioná-lo também?

    
por vfclists 13.04.2017 / 16:02

1 resposta

4

Você pode usar o recurso PROMPT_COMMAND , adicionar ao seu .profile / .bashrc :

myprompt() {  
  [[ "$PWD" != "$PREVPWD" ]] && history -s "# cd \"$PWD\""
  PREVPWD="$PWD" 
}  
PROMPT_COMMAND=myprompt

Isso coloca um comando (% commented)cd no seu histórico toda vez que o diretório atual é alterado. Ele armazena $PWD , então qualquer coisa como cd .. ainda registrará o caminho completo. Isso aparece no seu histórico normal, por isso não é o mais conveniente, e quebra atalhos como !$ ...

Aqui está uma versão melhor (ou seja, com engenharia excessiva), ele verifica se o comando anterior alterou o diretório para um diretório absoluto para evitar poluir o histórico:

myprompt() {
  local _seq _date _time _cmd _args
  [[ -z "$HISTTIMEFORMAT" ]] && { 
    ## reads history with no HISTTIMEFORMAT set
    read _seq _cmd _args < <(history 1)
  } || {
    ## this reads history with a HISTTIMEFORMAT='%Y%m%d %H:%M:%S '
    read _seq _date _time _cmd _args < <(history 1)
  }
  ## escaping =~ is troublesome, use variables instead
  local _re1='(cd|pushd|popd)'
  local _re2='^"?/'
  ## check for change-of-directory with absolute path
  [[ "$_cmd" =~ $_re1 && "$_args" =~ $_re2 ]] && {
    PREVPWD="$PWD"
    return
  }
  [[ "$PWD" != "$PREVPWD" ]] && {
     history -s "# cd \"$PWD\""    # stuff into history
     PREVPWD="$PWD"
  }
} 
PROMPT_COMMAND=myprompt

Pode precisar de pequenos ajustes se você tiver um HISTTIMEFORMAT personalizado.

Você pode ajustar a operação history -s para excluir e reinserir / modificar os comandos cd , pushd , popd , por exemplo,

  [[ "$_cmd" =~ $_re1 ]] && {
    history -d $_seq  # remove original user command
    history -s "$_cmd $_args # $_cmd \"$PWD\"" # add annotated version
  }

(Uma opção tentadora é alterar HISTTIMEFORMAT dinamicamente na função PROMPT_COMMAND , mas isso não é adicionado ao arquivo de histórico, ele só é aplicado quando você exibe o histórico, por isso não funcionará como esperado.)

O Bash salva os registros de data e hora do histórico como uma linha #nnnn (epoch-seconds) acima de cada entrada de comando. Em princípio, o $PWD poderia ser adicionado a essa linha após o registro de data e hora sem quebrar nada, mas algumas alterações de código não triviais seriam necessárias para suportar adequadamente isso.

    
por 13.04.2017 / 16:53