Erstens ist dies nicht spezifisch für Bash. ATT ksh, dash und zsh verhalten sich gleich: Sie ignorieren SIGTERM und SIGQUIT während der Befehlszeilenausgabe. mksh wird ebenfalls nicht beendet, sondern wie SIGINT behandelt.
Sowohl das ksh-Handbuch als auch das Bash-Handbuch rechtfertigen das Ignorieren von SIGTERM in folgenden Begriffen:
Das kill 0tötet also keine interaktive Shell
kill 0Bricht alle Prozesse in der Prozessgruppe ab , in der sich die Shell befindet¹. Kurz gesagt, die Prozessgruppe besteht aus allen Prozessen, die im Vordergrund auf einem Terminal ausgeführt werden, oder allen Prozessen in einem Hintergrund oder einem angehaltenen Job.
Genauer gesagt passiert dies in modernen Schalen mit Jobkontrolle . In solchen Shells kill 0wäre dies nicht sinnvoll, da sich die Shell in einer eigenen Prozessgruppe befindet. Ältere Shells (oder moderne Shells danach set +m) haben keine Prozessgruppen für Hintergrundbefehle erstellt. Sie können den Befehl also verwenden kill 0, um alle Hintergrundbefehle zu beenden, ohne sich abzumelden.² Daher kill 0sieht die Begründung wie eine alte aus, die heutzutage nicht mehr gerechtfertigt ist, sondern aus Gründen der Abwärtskompatibilität beibehalten wird.
Es gibt jedoch andere ähnliche Situationen, in denen es nützlich ist, die Schale immun zu machen. Stellen Sie sich den Fall vor, in dem Prozesse ein Terminal blockieren und Sie diese beenden möchten, ohne sich abzumelden. Viele Systeme verfügen über ein Tool, mit pkilldem Sie die auf einem Terminal ausgeführten Prozesse beenden können. Sie können alle Prozesse ausführen pkill -t $TTYoder pkill -QUIT -t $TTYbeenden, die auf dem aktuellen Terminal ausgeführt werden, mit Ausnahme der Shell, die das Signal ignoriert.
Eine Shell verschwindet normalerweise entweder, wenn der Benutzer sie verlässt (mit einem Befehl wie exitoder logout) oder wenn ihr Terminal das Ende der Eingabe signalisiert (der Benutzer kann dies durch Drücken von Ctrl+ verursachen D) oder ganz verschwindet. In diesem letzten Fall empfängt die Shell das Signal SIGHUP und ignoriert dieses nicht.
Wenn Sie sich von einer X-Sitzung abmelden, kill -15 -1wird dies ausgeführt, da der Terminalemulator beendet wird, wodurch die Shell SIGHUP empfängt. Es ist in der Tat genug, um den X-Server zu töten, aber das erfordert das Finden seiner Prozess-ID. Wenn Sie möchten, dass derselbe Befehl in einer Textsitzung ausgeführt wird, können Sie ihn verwenden kill -15 -1; exit. Das ist sowieso ein ziemlich gefährlicher Befehl.
¹ Dies scheint in der Regel nicht in Shell-Handbüchern erwähnt zu werden. Dies ist eine Funktion des zugrunde liegenden Systemaufrufs. Es wird ausdrücklich in der POSIX-Spezifikation erwähnt .
² Führen Sie jobs -ldazu heutzutage eine Liste der Jobs mit ihrer Prozessgruppen-ID aus und beenden Sie dann kill -123 -456 …die Prozessgruppen.
/bin/killoder die Shell eingebaut? Wenn letzteres der Fall ist, schätze ich, dass sich die Shell nicht mit ihrem eigenen eingebauten selbst umbringen wird.