
Mein $PS1
in Zsh enthält diesen Ausdruck: %(?. %?.)
Er bedeutet: „Wenn der Exit-Code des vorherigen Befehls ( $?
) wahr ist, zeige $?
, sonst zeige nichts.“ Das ist im Allgemeinen nützlich, aber eine Sache ärgert mich: Shells setzen den Rückgabecode des letzten Befehls auf einen Wert ungleich Null, wenn ich Strg+C drücke, ohne einen Befehl auszuführen! Zsh setzt ihn auf 1, Bash auf 130. Dash ist die einzige Shell auf meinem System, die ihn bei Strg+C nicht zurücksetzt.
So reproduzieren Sie:
- Starten Sie zsh oder bash.
- Drücken Sie Strg+C.
echo $?
.
Gibt es eine Möglichkeit, dieses Verhalten bei Zsh zu deaktivieren?
Antwort1
Ich glaube nicht, dass es eine Möglichkeit gibt, es auszuschalten.
Der erste Gedanke ist, dass preexec eine Variable setzt, die anzeigt, dass ein Befehl ausgeführt wurde. Wenn Sie in der Eingabeaufforderung Strg+C drücken, wird sie nicht gesetzt.
precmd() {
exit_status=$?
if ! $ran_something; then
exit_status=0
fi
ran_something=false
}
preexec() {
ran_something=true
}
show_non_zero_exit_status() {
case $exit_status in
0)
:;;
*)
echo $exit_status;;
esac
}
PS1='$(show_non_zero_exit_status)$ '
Es gibt jedoch ein anderes, ähnliches Problem: Wenn Sie einen Befehl anhalten, erhalten Sie den Exit-Status 20 (zsh < 5.0.7) oder 148 (bash und zsh >= 5.0.7).
Um das zu umgehen, können Sie 20|148
die case
obige Anweisung ergänzen, d.h.
show_non_zero_exit_status() {
case $exit_status in
0|20|148)
:;;
*)
echo $exit_status;;
esac
}
Wenn Sie zsh verwenden, stellen Sie sicher, dass Sie setopt promptsubst
in Ihrem haben .zshrc
.
Wenn Sie Bash verwenden, fügen Sie Folgendes hinzu:
PROMPT_COMMAND=precmd
trap preexec DEBUG
aber wirklich sollten Sie die kompliziertere DEBUG-Trap verwenden, die inhttps://superuser.com/a/175802/15334
Eine andere Möglichkeit ist, dass setopt printexitvalue
es nahe genug an dem liegt, was Sie möchten.
Antwort2
Hoffe, diese Frage interessiert die Leute im Jahr 2019 immer noch …
130
ist ein ziemlich seltener Exit-Status (ich glaube, dass UNIX in seiner frühen Implementierung nur Exit-Status bis 128 erkennt) – ignorieren Sie ihn also einfach.
# pseudocode
if exit_status == 0 then
do nothing
else
if exit_status == 130 then
do nothing
else
print " [red]exit_status[/red]"
In zsh
Worten ausgedrückt bedeutet dies:
%(0?..%(130?.. %F{red}%?%f))
Aktualisieren:Sie haben geschrieben, dass zsh
der Exit-Code auf 1
on Ctrl-C
und bash
auf gesetzt wird 130
. Hier, im Jahr 2019, geben sowohl bash
als auch zsh
zurück 130
.