Po pierwsze, nie jest to specyficzne dla bash. ATT ksh, dash i zsh zachowują się w ten sam sposób: ignorują SIGTERM i SIGQUIT podczas edycji wiersza poleceń; co do mksh, to również nie wychodzi, ale traktuje je jak SIGINT.
Zarówno podręcznik ksh, jak i podręcznik bash uzasadniają ignorowanie SIGTERM w następujących terminach:
dzięki czemu kill 0nie zabija interaktywnej powłoki
kill 0zabija wszystkie procesy w grupie procesów , w której znajduje się powłoka¹. W skrócie, grupa procesów składa się ze wszystkich procesów działających na pierwszym planie na terminalu lub wszystkich procesów w tle lub zawieszonym zadaniu.
Mówiąc dokładniej, dzieje się tak w nowoczesnych powłokach z kontrolą zadań . W takich powłokach kill 0nie byłoby to przydatne, ponieważ powłoka byłaby w swojej własnej grupie procesów. Starsze powłoki (lub współczesne po nich set +m) nie tworzyły grup procesów dla poleceń w tle. Można więc użyć tego polecenia, kill 0aby zabić wszystkie polecenia w tle bez wylogowania. ² W związku z tym kill 0uzasadnienie wygląda jak stare, które nie jest już uzasadnione, ale zachowuje zgodność wsteczną.
Istnieją jednak inne podobne sytuacje, w których uodpornienie skorupy jest przydatne. Rozważ przypadek, w którym procesy blokują terminal i chcesz je zabić bez wylogowania. Wiele systemów ma takie narzędzie, pkillktóre pozwala zabijać procesy uruchomione na terminalu. Możesz uruchomić pkill -t $TTYlub pkill -QUIT -t $TTYzabić wszystkie procesy uruchomione na bieżącym terminalu, z wyjątkiem powłoki, która ignoruje sygnał.
Powłoka zwykle znika albo, gdy użytkownik ją opuści (za pomocą polecenia typu exitlub logout), albo gdy jej terminal sygnalizuje koniec wejścia (użytkownik może to spowodować, naciskając Ctrl+ D) lub całkowicie znika. W tym ostatnim przypadku powłoka odbiera sygnał SIGHUP i tego nie ignoruje.
Zrobisz to na przykład w przypadku wylogowania z sesji X kill -15 -1, ponieważ zabija emulator terminala, który powoduje, że powłoka odbiera SIGHUP. W rzeczywistości wystarczy zabić serwer X, ale to wymaga znalezienia jego identyfikatora procesu. Jeśli chcesz, aby to samo polecenie działało w sesji tekstowej, możesz użyć kill -15 -1; exit. W każdym razie jest to dość niebezpieczne polecenie.
¹ Wydaje się, że nie jest to z reguły wspomniane w podręcznikach powłoki; jest to funkcja podstawowego wywołania systemowego. Jest to wyraźnie wymienione w specyfikacji POSIX .
² W tym jobs -lcelu biegnij, aby zobaczyć listę zadań z ich identyfikatorem grupy procesów, a następnie kill -123 -456 …zabić grupy procesów.
/bin/killczy wbudowana powłoka? Jeśli to drugie, domyślam się, że powłoka nie zabije się z własnym wbudowaniem.