是否有一些實用程式或插件包含 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可以將其添加到時間戳之後的該行,而不會破壞任何內容,但是需要進行一些重要的程式碼變更才能正確支援這一點。

相關內容