Rückgabewert nach Programmausführung drucken

9

Ich frage mich, wie ich die Option so einstellen kann, dass der Rückgabewert nach jeder Programmausführung im Terminal ohne Eingabe automatisch gedruckt wird echo $?.

Kann es eingerichtet werden? Codeblocks hat diese Funktion.

mr.backy
quelle

Antworten:

10

Ja, es gibt zwei Möglichkeiten. Einer ist zum Satz PROMPT_COMMANDin .bashrc, den anderen - zur Befehlssatz - Substitution in PS1dem 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 PS1Eingabeaufforderung 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 PS2zur Eingabe mehrzeiliger Befehle aufgefordert). Alternativ können Sie so etwas tun (beachten Sie die $'...'Struktur):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 
Sergiy Kolodyazhnyy
quelle
+1 Das funktioniert tatsächlich. Ich bezweifle niemanden mit einem Ruf von 27.000, aber anscheinend ist die Eingabeaufforderung kein "Befehl", also mit $? drin bekommt man nicht $? Auf Null zurücksetzen, wie ich es mir vorgestellt habe - sogar mit der ersten Methode, die das Echo fehlerfrei ausführt.
Joe
PS1ist 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
anzuzeigen
@mchid was meinst du?
Sergiy Kolodyazhnyy
1
@mchid "Vor dem Ausgeben jeder primären Eingabeaufforderung", also nachdem der letzte Befehl ausgeführt wurde.
Kos
1
@mchid wird ausgeführt, bevor die Eingabeaufforderung gedruckt wird - also bevor Sie den nächsten Befehl eingeben können.
Muru
4

Eine Methode, die ich aus dem Arch Wiki ausgewählt habe, ist zu trap ERR. trapwird in Bash verwendet, um Befehle auszuführen, wenn ein Signal empfangen wird, oder für bestimmte andere Ereignisse. Ein ERRTrap 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 echoBefehl, 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:

Geben Sie hier die Bildbeschreibung ein

Tatsächlich muss ich nur nach einem Gelb codein der Ausgabe Ausschau halten, um zu wissen, dass ein Befehl fehlgeschlagen ist.

muru
quelle