Auch nicht-0-exit-codes in das nachfolgende bash-Eingabeaufforderung
Gelegentlich werde ich einen Befehl ausführen, hat eine Menge Ausgaben. Gelegentlich, die letzten 30-40 Zeilen der Ausgabe (eine.k.ein. der einzige Teil der Ausgabe, die ich jemals wirklich zu sehen) ist in Ordnung, aber viel weiter vorne, es war ein Fehler. Ich würde gerne, um es einfacher, um zu bemerken, dass der Befehl fehlgeschlagen ist. So zu tun, ich will den return-code ein Teil meiner Aufforderung. Also nahm ich meine $PS1:
[\D{%Y-%m-%d} \t] \[\e]0;\u@\h: \w\a\]\$
...und erweitert diese:
[\D{%Y-%m-%d} \t] ${?/^0$/} \[\e]0;\u@\h: \w\a\]\$
Diese Ergebnisse in einen prompt wie diesen:
[2011-05-10 09:38:07] 0 soren@lenny:~$
Allerdings würde ich gerne einen Weg finden, um es nur den exit-code, wenn es nicht 0 ist. Wie kann ich das tun? Sicher, ich könnte
$(echo \$? | sed -e blah)
aber so leicht wie sed ist, ist es immer noch ein bisschen mehr schwere Gewicht als die bash die eingebauten Sachen.
- Cross-side-dupe: unix.stackexchange.com/q/23515/154731
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein wenig
printf
Missbrauch:printf '%.*s%.*s' $? $? $? ' '
damit wird es fügen Sie einen Raum nur, wenn es nicht null ist.Folgendes funktioniert bei mir:
PS1="[\D{%Y-%m-%d} \t] \u@\h:\w\a \${?##0} \$ "
Beispiel, wenn $? 0 ist:
Beispiel, wenn $? 130:
Könnten Sie verwenden die bash eingebauten pattern-matching:
Hier ist, was ich in meiner .bashrc zu bekommen, eine rote Zahl mit der exit-code. Die ausführliche, aber es bekommt den job getan und sollte tragbar sein.
Sie können eine if-Anweisung innerhalb Ihrer PS1, die Echos aus den exit-status nur, wenn es nicht null ist:
else
- Klausel. Beachten Sie die Bedeutung des Kopierens$?
auf eine lokale variable, wie[
wird über-schreiben, bevor dieecho
erreicht ist.Einen gemeinsamen Weg, dies zu tun ist die Verwendung
trap ... ERR
beliebigen code auszuführen, wenn ein Befehl fehlschlägt:Einem klassischen UNIX-Scherz ist
trap 'echo You have new mail.' ERR
Für Benutzer der zsh: stecken Sie diesen in die EINGABEAUFFORDERUNG:
%(?,, -%?-)
Dies ist die Eingabeaufforderung, die ich verwenden, legen Sie in .bashrc und Quelle um es zu benutzen. Wie Sie sehen können die PREV_RET_VAL angehängt wird, um PS1 nur in dem Fall, der Wert ist nicht 0.
Apostroph Beispiel:
PS1='${?#0}> '
Doppelte Anführungszeichen ein Beispiel (beachten Sie die zusätzlichen umgekehrten Schrägstrich als escape
$
)PS1="\${?#0}> "
Beispiel-Ausgabe:
Erklärung:
${var#pattern}
ist ein bash parameter expansion, das heißt, entfernen Sie die kürzeste passende Muster vom vor $var. Also in diesem Fall, wir entfernen0
von vorne$?
, die würde effektiv abschneiden exit-code0
.Wenn Sie doppelte Anführungszeichen,
$?
ersetzt werden würde, wennPS1
gesetzt ist, anstatt jedesmal mit ausgewertet. Tunecho $PS1
zu bestätigen, Sie nicht über einen hartcodierten Wert inPS1
.