Для истории 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
было бы добавить к этой строке после временной метки, ничего не сломав, но для надлежащей поддержки этого потребуются некоторые нетривиальные изменения кода.