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