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.