Erstellen Sie mithilfe einer Bash-Funktion einen Wrapper um Bash

Erstellen Sie mithilfe einer Bash-Funktion einen Wrapper um Bash

Ich bin etwas skeptisch, was das Herumspielen mit den Bash-History-Einstellungen angeht, und möchte einfach meine eigene benutzerdefinierte Bash-History schreiben. Ich habe darüber nachgedacht, eine Bash-Funktion wie diese zu verwenden:

bash(){

  # write to a custom history file manually
  echo "$@" >> $HOME/my_bash_history

  command bash "$@" 

}

export -f bash;

aber das funktioniert nicht ganz - was passiert, ist, dass die Funktion command bashübernimmt und die Dinge nicht mehr über die Bash-Funktion laufen. Ich muss alle Standardeingaben zur Bash über diese Bash-Funktion laufen lassen, damit alles in eine benutzerdefinierte Datei geschrieben wird. Hat jemand eine Idee, wie das geht?

Antwort1

Was Sie möchten, ist eine DEBUGFalle (vor jedem Befehl ausführen) oder möglicherweise eine PROMPT_COMMAND(vor jeder Eingabeaufforderung ausführen).

Die Falle ist näher an Ihrem Versuch. Das Grundkonzept ist inVerfügt Bash über einen Hook, der vor der Ausführung eines Befehls ausgeführt wird?und eine ausgefeilte schlüsselfertige Version existiert alsbash-preexec.

Laut seinem Autor wird bash-preexec verwendet vonBashhubum einen „Bash-Verlauf in der Cloud“ bereitzustellen, daher bin ich sicher, dass es der Aufgabe des „Bash-Verlaufs in einer Datei“ gewachsen ist.

Antwort2

Sie versuchen, etwas Äquivalentes zu implementierendiese "ewige Geschichte":

export HISTTIMEFORMAT="%s "
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"'echo $$ $USER \
           "$(history 1)" >> ~/.bash_eternal_history'

Die Kernidee besteht darin, dass history 1(in Bash) die letzte an Bash übergebene Zeile aufgelistet wird.

$ echo "$(history 1)"
12766  2019-05-31T20:14:44+0000 echo "$(history 1)"

Was eigentlich nur innerhalb eines Skripts einen sinnvollen Wert hat (nicht dieselbe Zeile).

Und; PROMPT_COMMANDführt den historyBefehl für jede neue Zeile aus, die an Bash übergeben wird.

Meiner Meinung nach scheint es keine gute Idee zu sein, eine Funktion zu benennen bash.

verwandte Informationen