Você pode usar o recurso PROMPT_COMMAND , adicionar ao seu .profile / .bashrc :
myprompt() {
[[ "$PWD" != "$PREVPWD" ]] && history -s "# cd \"$PWD\""
PREVPWD="$PWD"
}
PROMPT_COMMAND=myprompt
Isso coloca um comando (% commented)cd no seu histórico toda vez que o diretório atual é alterado. Ele armazena $PWD , então qualquer coisa como cd .. ainda registrará o caminho completo. Isso aparece no seu histórico normal, por isso não é o mais conveniente, e quebra atalhos como !$ ...
Aqui está uma versão melhor (ou seja, com engenharia excessiva), ele verifica se o comando anterior alterou o diretório para um diretório absoluto para evitar poluir o histórico:
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
Pode precisar de pequenos ajustes se você tiver um HISTTIMEFORMAT personalizado.
Você pode ajustar a operação history -s para excluir e reinserir / modificar os comandos cd , pushd , popd , por exemplo,
[[ "$_cmd" =~ $_re1 ]] && {
history -d $_seq # remove original user command
history -s "$_cmd $_args # $_cmd \"$PWD\"" # add annotated version
}
(Uma opção tentadora é alterar HISTTIMEFORMAT dinamicamente na função PROMPT_COMMAND , mas isso não é adicionado ao arquivo de histórico, ele só é aplicado quando você exibe o histórico, por isso não funcionará como esperado.)
O Bash salva os registros de data e hora do histórico como uma linha #nnnn (epoch-seconds) acima de cada entrada de comando. Em princípio, o $PWD poderia ser adicionado a essa linha após o registro de data e hora sem quebrar nada, mas algumas alterações de código não triviais seriam necessárias para suportar adequadamente isso.