Setzen Sie „$?“ bei Strg+C nicht auf einen Wert ungleich Null.

Setzen Sie „$?“ bei Strg+C nicht auf einen Wert ungleich Null.

Mein $PS1in 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:

  1. Starten Sie zsh oder bash.
  2. Drücken Sie Strg+C.
  3. 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|148die caseobige 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 promptsubstin 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 printexitvaluees nahe genug an dem liegt, was Sie möchten.

Antwort2

Hoffe, diese Frage interessiert die Leute im Jahr 2019 immer noch …

130ist 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 zshWorten ausgedrückt bedeutet dies:

%(0?..%(130?.. %F{red}%?%f))

Aktualisieren:Sie haben geschrieben, dass zshder Exit-Code auf 1on Ctrl-Cund bashauf gesetzt wird 130. Hier, im Jahr 2019, geben sowohl bashals auch zshzurück 130.

verwandte Informationen