Jeder Befehl in meinem Terminal, der mit einem Code ungleich Null beendet wird, schließt mein Terminalfenster

22

Anfangs war das ein bisschen lustig, als würde man "Bash Roulette" spielen ... aber jetzt wird es alt, lol

Jeder Befehl in meinem Terminal, der mit einem Code ungleich Null beendet wird, schließt mein Terminalfenster

Mir wurde gesagt, dass ich vielleicht set -eirgendwo ein Bash-Skript eingestellt habe, das mein Terminal bereitstellt.

Ich habe überprüft .bash_profile/ .bashrc/ .profileund es sieht nicht so set -edrin ist.

Gibt es noch andere offensichtliche Schuldige?

Alexander Mills
quelle
7
Führen Sie ein aus set +e, repariert es das Problem? Wenn ja, was ich vermute, dann müssen Sie weiter suchen set -e. Dies kann in den globalen Versionen dieser Dateien unter /etcoder in einem anderen Skript geschehen, das von ihnen stammt. Verschieben Sie Ihre Konfigurationsdateien weg. Wenn das Problem behoben ist, fügen Sie die Zeilen in kleineren Blöcken wieder hinzu, um zu sehen, wo sie brechen.
egmont
3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapkönnte informativ sein.
muru
Sie können den Satz von derzeit aktiviert Shell Fahnen mit der speziellen Variable inspizieren -wie folgt: echo $-.
David Foerster

Antworten:

21

Okay, es war in der Tat ein Irrweg set -e, der meine Probleme verursacht hat.

Die Art und Weise, wie ich sie fand, set -ewurde benutztbash -lx

Am besten verwenden Sie:

bash -lx > lx.log 2>&1

dann öffne diese Logdatei und suche nach set...

Wenn set -eSie diesen Fehler gefunden haben , können Sie diese Zeile entfernen und Ihr Problem sollte behoben sein! (Ein Neustart der Maschine ist empfehlenswert).

In meinem Fall befand sich das set -ein einer Datei, die von .bash_profile erstellt wurde, aber die Zeile befand sich nicht in .bash_profile.

Alexander Mills
quelle
3
Dinge, die sourcein Ihrer Shell sicher sind, sind viel kleiner als nur "zufällige Shell-Skripte". -ekann in tatsächlichen Skripten nützlich sein, um dumme Fehler zu überprüfen. (Oder um sicherzugehen, dass Sie nicht vergessen haben , irgendetwas zu überprüfen.)
Peter Cordes
Anscheinend ist das der Fall ... ich wünschte, es gäbe so etwas global set -e, das set -enur das enthaltene Drehbuch betrifft
Alexander Mills
@AlexanderMills, das zu tun, könnten Sie überprüfen , $-für die Flagge im inneren Skript zu prüfen und seinen Zustand am Ende wieder herzustellen, oder es nur am Haupt Skript zurückgesetzt , wenn Sie wissen , Sie haben Skripte stammen , die es setzen würden
ilkkachu
Ich vermute also, dass local set -ees nur in einer Bash-Funktion verwendet werden kann?
Alexander Mills
13

Wenn Sie das Problem nur lösen möchten, fügen set +eSie .bashrcam Ende Ihr - hinzu .

Sie können graben gehen - es gibt viele andere Orte, an denen sich ein befinden set -ekönnte -, aber das kümmert sich um das Los.

Wenn dies jedoch set -eTeil Ihres $PROMPT_COMMANDist, funktioniert das oben Genannte nicht. Probieren printf '%s\n' "$PROMPT_COMMAND"Sie aus, was drin ist.

Platzhalter
quelle
Wenn ich auf meinem Computer ein Terminal öffne, wird printf '%s\n' "$PROMPT_COMMAND"nur Leerzeichen ausgegeben, nichts
Alexander Mills
@AlexanderMills, dann ist das nicht dein Problem. Eine häufige Verwendung für $PROMPT_COMMANDist das Aktualisieren des Registerkartennamens oder Fensternamens des Terminals. MacOS X und Ubuntu tun dies beide. Informationen dazu für Mac finden Sie unter apple.stackexchange.com/q/220641/151730 .
Wildcard
Ich fand eine Antwort auf das Problem und fügte meine eigene Antwort hinzu set +e, die möglicherweise nicht funktionierte, weil sie vor dem set -eAnruf in meinen Bash-Dateien gespeichert war.
Alexander Mills
1
@AlexanderMills, ja, ich dachte das wäre implizit. Ich wollte an deine anhängen , nicht gleich am Anfang. Das habe ich jetzt in meiner Antwort deutlich gemacht. Gut, dass Sie die Quelle gefunden haben! set +e.bashrc
Wildcard
Ja, set +eist natürlich nur ein Pflaster, aber Sie haben gesagt, dass
Alexander Mills