So rufen Sie nach jedem Bash-Befehl ein Skript auf

22

Ist es möglich, in diesem Beispiel ein Skript aufzurufen, das hey.shnach jedem Bash-Befehl benannt ist?

Zum Beispiel tippen Sie lsdie Eingabetaste und ls wird ausgeführt, dann wird hey.shausgeführt.

Sie geben dann cd .. (oder einen anderen Befehl) ein , cd wird ausgeführt und dann wird hey.shausgeführt und so weiter.

John
quelle
2
Dies ist entweder ein XY-Problem oder eine sehr seltsame Idee. Was versuchst du eigentlich zu erreichen?
Jasonwryan
Alias ​​in bash.rc vielleicht?
Moonbutt74

Antworten:

29
PROMPT_COMMAND+="hey.sh;"

PROMPT_COMMAND Wenn gesetzt, wird der Wert als Befehl ausgeführt, bevor jede primäre Eingabeaufforderung ausgegeben wird.


Hinweis: Umgebungsvariablen vs Shell-Variablen

In der Standardeinstellung PROMPT_COMMANDist nicht eine Umgebungsvariable . Es ist nur eine Shell-Variable .

Auf beide Variablentypen wird auf dieselbe Weise zugegriffen ( "$variable*"), Umgebungsvariablen werden jedoch von untergeordneten Prozessen geerbt, Shell-Variablen hingegen nicht.

Die Konvention besteht darin, Umgebungsvariablen + Shell-Variablen, die Ihre Shell konfigurieren, in Großbuchstaben zu setzen (PROMPT_COMMAND konfiguriert Ihre Shell), andere Variablentypen jedoch in Kleinbuchstaben.

In bash können Sie Folgendes tun: declare -pum herauszufinden, ob eine Variable exportiert wird (= ist eine Umgebungsvariable) oder nicht:

$ declare -p PATH
declare -x PATH=... #-x means it's exported
$ declare PROMPT_COMMAND
declare -- PROMPT_COMMAND=... #no -x so just a shell variable
PSkocik
quelle
2
@ John Nr Do not exportes. Legen Sie es einfach fest (oder hängen Sie es an, z. B. wie oben gezeigt).
PSkocik
Schön, was ist danach?
Moonbutt74
2
@ moonbutt74 vor jedem Befehl == nach jedem Befehl + zu Beginn Ihrer Bash-Sitzung
PSkocik
@PSkocik Ich war nur neugierig, ob das bereits eine Umgebungsvariable ist, und habe auf einen kurzen Echo-Befehl herausgefunden, dass dies der Fall ist. Das macht genau das, wonach ich gesucht habe
John
@ John Standardmäßig ist es nur eine Shell-Variable, keine Umgebungsvariable.
PSkocik