Führen Sie das Bash-Skript jedes Mal aus, wenn Befehlszeilen ausgeführt werden

9

Ich bin ein neuer Ubuntu / Linux-Benutzer und möchte eine Frage als meinen Titel oben stellen.

Zum Beispiel habe ich eine Bash-Datei ./script, die automatisch ausgeführt werden soll, wenn ich eine Befehlszeile eingebe. Sobald ich Befehlszeile ausführen pwddann das ./scriptwird ausgeführt. Sobald ich die nächste Befehlszeile ls -ladann die ./scripterneut ausgeführt.

Ender Phan
quelle
4
Dürfen wir fragen: Welche Art von Aktion beabsichtigen Sie für jeden einzelnen eingegebenen Befehl auszuführen? und sollte es nur für diejenigen sein, die interaktiv getippt werden? oder auch für irgendeinen Befehl in einem Skript? und was ist mit Befehlen, die über ssh eingegeben wurden? usw. Dies könnte ein XYProblem sein
Olivier Dulac

Antworten:

13

Sie müssen eine PROMPT_COMMANDVariable festlegen . Von man bash:

PROMPT_COMMAND
              If set, the value is executed as a command prior to
              issuing each primary prompt.

Dies schreibt beispielsweise das aktuelle Datum in /tmp/PCjedes Mal, wenn ein Befehl ausgeführt wird:

 $ PROMPT_COMMAND="date > /tmp/PC"
Arkadiusz Drabczyk
quelle
1
Ja, ich habe es verstanden ... ziemlich coole Lösung. (positiv bewertet)
Ender Phan
1
Das ist falsch. Der Befehl echo $(date)wird zur Deklarationszeit ausgeführt, sodass immer dieselbe Zeit angezeigt (gespeichert) wird.
Heemayl
@heemayl: Natürlich hast du recht, ich habe es behoben
Arkadiusz Drabczyk
@ lộcphan Wenn eine dieser Antworten Ihr Problem gelöst hat, nehmen Sie sich bitte einen Moment Zeit und akzeptieren Sie es, indem Sie auf das Häkchen links klicken. Dadurch wird die Frage als beantwortet markiert und auf die Stack Exchange-Websites wird der Dank ausgesprochen.
Terdon
@heemayl: Warum? ...
Arkadiusz Drabczyk
11

Wenn Sie nach einer PROMPT_COMMANDUmgebungsvariablen suchen , wird der Wert dieser Variablen als Befehl ausgeführt, nachdem jeder im Terminal angegebene Befehl ausgeführt wurde, kurz bevor die nächste Eingabeaufforderung angezeigt wird.

Stellen Sie es beispielsweise wie folgt ein:

export PROMPT_COMMAND='/path/to/script'

Machen Sie das Skript /path/to/scriptzuerst ausführbar.

Jetzt wird das Skript nach jedem Befehl ausgeführt.

Wenn Sie nicht möchten, dass die Variable exportiert wird, dh eine Shell-Variable anstelle einer Umgebungsvariablen erstellen, lassen Sie Folgendes fallen export:

PROMPT_COMMAND='/path/to/script'

Von man bash:

PROMPT_COMMAND 
If set, the value is executed as a command prior to issuing each primary prompt.
heemayl
quelle
Ich habe es verstanden, vielen Dank für Ihre Hilfe :) (übrigens positiv bewertet)
Ender Phan
Warum benutzt du export?
Arkadiusz Drabczyk
@ArkadiuszDrabczyk exportmacht die Variable zu PROMPT_COMMANDeiner Umgebungsvariablen, dh die Variable steht allen untergeordneten Prozessen (z. B. Subshells) der aktuellen Shell zur Verfügung. Wenn Sie es nur innerhalb der aktuellen Shell-Sitzung (Shell-Variable) einschränken möchten, entfernen Sie es export.
Heemayl
5
@heemayl: IMO exportist hier keine gute Praxis - PROMPT_COMMANDsollte nur in einer interaktiven Shell-Startdatei festgelegt werden und sollte nicht in der Umgebung sichtbar sein
Arkadiusz Drabczyk