Antworten:
Ja, es gibt zwei Möglichkeiten. Einer ist zum Satz PROMPT_COMMAND
in .bashrc
, den anderen - zur Befehlssatz - Substitution in PS1
dem echo $?
Befehl.
Methode 1:
Von der Bash-Handbuchseite:
PROMPT_COMMAND
If set, the value is executed as a command prior to issuing each primary prompt.
Was auch immer Sie für diese Variable festlegen, wird jedes Mal ausgeführt, bevor Sie die Eingabeaufforderung zeichnen. Demo:
$> PROMPT_COMMAND=" echo 'Last command exited with' \$? 'code' "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$>
Beachten Sie die Verwendung von \$?
. Speichern Sie es für dauerhafte Änderungen in.bashrc
Methode 2
Angenommen, meine PS1
Eingabeaufforderung lautet wie folgt:
PS1='
user@ubuntu:$> '
Wenn ich jedes Mal ein Programm ausführen möchte, wenn diese Eingabeaufforderung auf dem Bildschirm neu gezeichnet wird (dh nachdem jeder vorhergehende Befehl ausgeführt wurde), muss ich es wie folgt verwenden command substitution $(. . .)
und in der Eingabeaufforderung festlegen:
PS1=' [ $? ]
user@ubuntu: $> '
Demo:
$> PS1=' [ $? ]
> $>_ '
[ 0 ]
$>_ ls /etc/passwd > /dev/null
[ 0 ]
$>_ ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
[ 2 ]
$>_
Beachten Sie, dass ich meine PS1 in zwei Zeilen aufgeteilt habe, oben [ exitcode ]
und unten $> <blank space>'
. Das ist der Grund, warum es in der zweiten Zeile >
vorher gibt $> '
(der führende >
wird PS2
zur Eingabe mehrzeiliger Befehle aufgefordert). Alternativ können Sie so etwas tun (beachten Sie die $'...'
Struktur):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
PS1
ist nur Text, der gedruckt wird, bevor Benutzereingaben eingehen - mehr nicht. Es ist nicht immun gegen Parametererweiterungen und Befehlssubstitutionen, so dass Sie $(...)
beispielsweise alles eingeben können $( pwd )
und es dort angezeigt wird. Ich habe das mit einem benutzerdefinierten Skript verwendet, um beispielsweise die Batterieleistung des Laptops
Eine Methode, die ich aus dem Arch Wiki ausgewählt habe, ist zu trap
ERR
. trap
wird in Bash verwendet, um Befehle auszuführen, wenn ein Signal empfangen wird, oder für bestimmte andere Ereignisse. Ein ERR
Trap wird immer dann ausgeführt, wenn die aktuelle Befehlszeile mit einem Fehler beendet wird - der Rückgabewert ist nicht 0. (Wenn er normal beendet würde, wäre der Rückgabewert offensichtlich 0.)
Also zum Beispiel:
trap 'printf "\ncode %d\n\n" $?' ERR
Dann:
$ echo foo
foo
$ false
code 1
$
(Hinweis: Keine Nachricht nach dem echo
Befehl, der erfolgreich ausgeführt wurde. Was bedeutet es, wenn ich einen Befehl eingebe und das Terminal nichts tut? )
Der Arch Wiki-Tipp hat die Nachricht eingefärbt, sodass Sie eine auffällige gelbe Nachricht erhalten:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
Bewirken:
Tatsächlich muss ich nur nach einem Gelb code
in der Ausgabe Ausschau halten, um zu wissen, dass ein Befehl fehlgeschlagen ist.