是否有一些实用程序或插件包含 bash 历史记录中的当前目录?

是否有一些实用程序或插件包含 bash 历史记录中的当前目录?

对于 bash 历史记录来说,显示执行命令的工作目录非常有用。历史有助于了解您所做的事情,但很难判断您在哪里做的。

是否有这样的插件或实用程序,或者 bash 也可以配置为添加它?

答案1

您可以使用PROMPT_COMMAND功能,添加到您的.profile/ .bashrc

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

cd每次当前目录更改时,都会将(注释掉的)命令填充到您的历史记录中。它存储$PWD,因此类似的内容cd ..仍会记录完整路径。这出现在您的正常历史记录中,因此它不是最方便的,并且它破坏了速记,例如!$......

这是更好的(即过度设计的)版本,它检查前一个命令是否将目录更改为绝对目录以防止污染历史记录:

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

如果您有自定义,可能需要进行一些微调HISTTIMEFORMAT

您可以调整history -s操作以删除并重新插入/修改cd, pushd,popd命令,例如

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

HISTTIMEFORMAT(一个诱人的选项是在函数中动态更改PROMPT_COMMAND,但这不会添加到历史文件中,它仅在显示历史记录时应用,因此它不会按希望的方式工作。)

Bash 将历史时间戳保存为#nnnn每个命令条目上方的(纪元秒)行。原则上,$PWD可以将其添加到时间戳之后的该行,而不会破坏任何内容,但是需要进行一些重要的代码更改才能正确支持这一点。

相关内容