对于 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
可以将其添加到时间戳之后的该行,而不会破坏任何内容,但是需要进行一些重要的代码更改才能正确支持这一点。