Gibt es ein Dienstprogramm oder Plug-In, das das aktuelle Verzeichnis in den Bash-Verlauf einbezieht?

Gibt es ein Dienstprogramm oder Plug-In, das das aktuelle Verzeichnis in den Bash-Verlauf einbezieht?

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_COMMANDFunktion, fügen Sie zu Ihrem .profile/ hinzu .bashrc:

myprompt() {  
  [[ "$PWD" != "$PREVPWD" ]] && history -s "# cd \"$PWD\""
  PREVPWD="$PWD" 
}  
PROMPT_COMMAND=myprompt

cdDies 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 -szu löschen und erneut einzufügen/ändern cd, z. B.pushdpopd

  [[ "$_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 $PWDkö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.

verwandte Informationen