Konfigurieren Sie die Bash, um den Exit-Status jedes eingegebenen Befehls zu drucken

9

Jeder Befehl, den ich in bash eingebe, gibt einen Exit-Code zurück.

Ich möchte:
Immer wenn ich an der Bash-Eingabeaufforderung einen Befehl eingebe, soll der Exit-Status beendet werden, d. H. echo $? .

z.B. Wenn ich echo "hello"; an der Bash-Eingabeaufforderung ausführte, sollte die Ausgabe folgendermaßen aussehen:

[email protected]$ hello
[email protected]$ 0
    
ravidixit 23.10.2013, 07:38

3 Antworten

12

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

Bearbeiten Sie also die Zeile in $HOME/.bashrc ( /etc/bash.bashrc wäre systemweit) vom Standardwert aus:

PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w$ '

dazu (zum Beispiel):

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

Die Standardaufforderung wurde geändert in:

[email protected]:/path/to/dir[0] $

Die 0 in Klammern ist Ihr Exit-Code, siehe:

[email protected]:~[0] $ ls
[email protected]:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
[email protected]:~[2] $ ^C
[email protected]:~[130] $

Zu den Bedeutungen siehe Link

    
chaos 23.10.2013, 07:52
5

Eine andere Möglichkeit, die ich aus dem Arch Wiki ausgewählt habe, war die Verwendung von trap :

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

Effekt:

$ ( exit 1 )
code 1

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

$
    
muru 21.09.2014 22:46
2

Hier ist ein einfaches Beispiel:

PS1='$? > '

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

zu umgehen
PS1="$? > "

Ausgabe:

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

Noch besser ist es, den Exit-Code nur zu drucken, 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} ist eine Erweiterung der Bash-Parameter, dh das kürzeste übereinstimmende Muster muss vor $ var entfernt werden. In diesem Fall entfernen wir also 0 von der Vorderseite von $? , wodurch der Beendigungscode von 0 effektiv abgeschnitten wird.

Wenn Sie doppelte Anführungszeichen verwenden, wird $? ersetzt, wenn PS1 gesetzt wird, anstatt jedes Mal ausgewertet zu werden. Führen Sie echo $PS1 aus, um zu bestätigen, dass in PS1 kein fest codierter Wert vorhanden ist.

    
wisbucky 10.03.2017 21:47

Tags und Links