Wie konfiguriere ich bash, um den Exit-Status für jeden Befehl zu drucken?

12

Jeder in bash ausgeführte Befehl gibt einen Exit-Code zurück.

Immer wenn ich einen Befehl an der Bash-Eingabeaufforderung eingebe, soll der Beendigungsstatus angezeigt werden, z. echo $?

Wenn ich beispielsweise eine echo "hello";Bash-Eingabeaufforderung ausführe , sollte die Ausgabe wie folgt aussehen:

linux@linux$ hello
linux@linux$ 0
ravidixit
quelle
Was ist mit dem Posten Ihrer Frage auf unix.stackexchange.com ?
Danke @Frank. Aber ist es nicht auch ein guter Ort, um diese Frage zu stellen?
Ravidixit
Ich habe versucht, es als Teil der PS1-Variablen auszudrucken, aber aus Gründen, die ich noch nicht verstehe, funktioniert es nicht.
Ravidixit

Antworten:

13

Der Beendigungscode des zuletzt ausgeführten Befehls wird in der $?Umgebungsvariablen gespeichert . Sie können diese Variable also einfach zur Standard-Eingabeaufforderung hinzufügen, und der Beendigungscode wird immer dort gedruckt. Die Eingabeaufforderung wird in der $PS1Umgebungsvariablen gespeichert . Es wird anfänglich im /etc/bash.bashrcSkript und später im Skript festgelegt $HOME/.bashrc.

Bearbeiten Sie also die Zeile in $HOME/.bashrc ( /etc/bash.bashrcwäre systemweit) von ihrem Standardwert:

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

dazu (zum Beispiel):

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '

Die Standardeingabeaufforderung wurde folgendermaßen geändert:

user@host:/path/to/dir[0] $

Die 0 in den Klammern ist Ihr Beendigungscode, siehe:

user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $

Die Bedeutung finden Sie unter http://www.tldp.org/LDP/abs/html/exitcodes.html

Chaos
quelle
Ich habe versucht, es zu tun, aber für die Bash zur Hand, es funktioniert nicht. Es wird immer [0] für die Maschine angezeigt, an der ich arbeite.
Ravidixit
Bist du sicher, dass du eine Bash machst? Können Sie die Ausgabe von readlink /proc/$$/exeplease kopieren ? 0 bedeutet kein Fehler, haben Sie etwas versucht, das einen Fehler ergibt: ^Coder falseoder asdasdasd?
Chaos
1
@chaos Ich habe meine PS1 als PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"), aber es zeigt nur die 0ganze Zeit. Irgendeine Idee warum?
Max
1
Es wäre schön, wenn der Ausgangsstatus nur angezeigt würde, wenn er ungleich 0 ist
rubo77
1
@max Es liegt daran, dass dein $?bereits erweitert ist, 0wenn du dein setzt PS1. Tun echo $PS1Sie und Sie werden sehen. Sie müssen entweder einfache Anführungszeichen verwenden oder es wie entkommen \$?.
wisbucky
7

Ein anderer Weg, den ich aus dem Arch Wiki gewählt habe, war trap:

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR

Bewirken:

$ ( exit 1 )
code 1

$ some-non-existent-command
some-non-existent-command: command not found
code 127

$
muru
quelle
2
Das entspricht nicht ganz den Anforderungen des OP, da er den Ausgangsstatus ausdrucken möchte, auch wenn er Null ist - aber genau das habe ich gesucht.
Keith Thompson
2

Hier ist ein einfaches Beispiel:

PS1='$? > '

Wenn Sie doppelte Anführungszeichen verwenden, müssen Sie einen Backslash hinzufügen, um Folgendes zu umgehen $:

PS1="\$? > "

Ausgabe:

0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 > 

Noch besser ist es, den Exit-Code nur dann auszudrucken, wenn er nicht Null ist.

PS1='${?#0}> '    # single quote example
PS1="\${?#0}> "   # double quote example (requires extra backslash)

Beispielausgabe:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

Erläuterung: ${var#pattern}Dies ist eine Bash-Parameter-Erweiterung, bei der das kürzeste übereinstimmende Muster von der Vorderseite von $ var entfernt wird. In diesem Fall entfernen wir also 0von vorne $?, wodurch der Beendigungscode von effektiv abgeschnitten wird 0.

Wenn Sie doppelte Anführungszeichen verwenden, $?wird ersetzt, wenn PS1festgelegt, anstatt jedes Mal ausgewertet zu werden. Tun echo $PS1Sie dies, um zu bestätigen, dass Sie keinen fest codierten Wert in haben PS1.

weises Glück
quelle
Vielen Dank ab Januar 2018. Ich möchte die normale Eingabeaufforderung mit dem Beendigungscode am Anfang, wenn es nicht Null ist - das hilft sehr.
SDsolar