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

Связанный контент