Es ist sehr nützlich, wenn der Bash-Verlauf das Arbeitsverzeichnis anzeigt, in dem die Befehle ausgeführt wurden. Der Verlauf ist gut, um zu sehen, was Sie getan haben, aber es kann schwierig sein, zu sagen, wo Sie es getan haben.
Gibt es ein solches Plug-In oder Dienstprogramm, oder kann Bash so konfiguriert werden, dass es auch hinzugefügt wird?
Antwort1
Du kannst den ... benutzenPROMPT_COMMAND
Funktion, fügen Sie zu Ihrem .profile
/ hinzu .bashrc
:
myprompt() {
[[ "$PWD" != "$PREVPWD" ]] && history -s "# cd \"$PWD\""
PREVPWD="$PWD"
}
PROMPT_COMMAND=myprompt
cd
Dies fügt jedes Mal, wenn sich das aktuelle Verzeichnis ändert, einen (auskommentierten) Befehl in Ihren Verlauf ein. Es speichert $PWD
, sodass alles wie cd ..
immer den vollständigen Pfad aufzeichnet. Dies erscheint in Ihrem normalen Verlauf, ist also nicht besonders praktisch und es zerstört Abkürzungen wie !$
...
Hier ist eine bessere (d. h. überentwickelte) Version. Sie prüft, ob der vorherige Befehl das Verzeichnis in ein absolutes Verzeichnis geändert hat, um eine Verfälschung des Verlaufs zu verhindern:
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
Wenn Sie eine benutzerdefinierte haben, sind möglicherweise geringfügige Anpassungen erforderlich HISTTIMEFORMAT
.
Sie können die Operation optimieren , um stattdessen die Befehle , , history -s
zu löschen und erneut einzufügen/ändern cd
, z. B.pushd
popd
[[ "$_cmd" =~ $_re1 ]] && {
history -d $_seq # remove original user command
history -s "$_cmd $_args # $_cmd \"$PWD\"" # add annotated version
}
HISTTIMEFORMAT
(Eine verlockende Option besteht darin , dynamische Änderungen in der Funktion vorzunehmen PROMPT_COMMAND
, dies wird jedoch nicht zur Verlaufsdatei hinzugefügt, sondern nur angewendet, wenn Sie den Verlauf anzeigen, sodass es nicht wie erhofft funktioniert.)
Bash speichert Verlaufszeitstempel als #nnnn
(Epochensekunden-)Zeile über jedem Befehlseintrag. Im Prinzip $PWD
könnte man sie dieser Zeile nach dem Zeitstempel hinzufügen, ohne dass etwas kaputt geht, aber um dies richtig zu unterstützen, wären einige nicht triviale Codeänderungen erforderlich.