まず、これはbashに固有のものではありません。ATT ksh、dash、zshは同じように動作します。これらはコマンドラインの編集中にSIGTERMとSIGQUITを無視します。mkshについても、終了せずにSIGINTのように扱います。
kshマニュアルとbashマニュアルはどちらも、これらの用語でSIGTERMを無視することを正当化します。
そのためkill 0
、対話型シェルを殺すことはありません
kill 0
シェルが含まれているプロセスグループ内のすべてのプロセスを強制終了します。簡単に言えば、プロセスグループは、ターミナルのフォアグラウンドで実行されているすべてのプロセス、またはバックグラウンドジョブまたは中断されたジョブのすべてのプロセスで構成されます。
より正確には、これはジョブ制御を備えた最新のシェルで何が起こるかです。このようなシェルでkill 0
は、シェルは独自のプロセスグループに含まれるため、役に立ちません。古いシェル(またはの後の最新のシェルset +m
)は、バックグラウンドコマンドのプロセスグループを作成しませんでした。したがって、このコマンドkill 0
を使用して、ログアウトせずにすべてのバックグラウンドコマンドを強制終了できます。²したがって、このkill 0
根拠は、現在正当化されなくなった古いバージョンのように見えますが、下位互換性のために保持されています。
ただし、シェルを無効にすることが役立つ他の同様の状況があります。端末を占有するプロセスがあり、ログアウトせずにそれらを強制終了したい場合を考えてみてください。多くのシステムにはpkill
、ターミナルで実行されているプロセスを強制終了できるツールがあります。シグナルを無視するシェルを除いて、現在の端末で実行されているすべてのプロセスを実行pkill -t $TTY
または強制終了できますpkill -QUIT -t $TTY
。
シェルは通常、ユーザーが(exit
またはのようなコマンドでlogout
)シェルを終了するとき、またはそのターミナルが入力の終わりを通知するとき(ユーザーはCtrl+ を押すことでこれを引き起こす可能性がありますD)または完全に消えます。この最後のケースでは、シェルはシグナルSIGHUPを受信し、それを無視しません。
Xセッションからログアウトするユースケースでkill -15 -1
は、シェルがSIGHUPを受信する原因となるターミナルエミュレーターを強制終了するため、ログアウトします。実際にはXサーバーを強制終了するには十分ですが、そのためにはプロセスIDを見つける必要があります。同じコマンドをテキストセッションで機能させたい場合は、を使用できますkill -15 -1; exit
。それはとにかくあなたの指先で持っていることは非常に危険なコマンドです。
¹ これは、原則としてシェルのマニュアルには記載されていないようです。これは、基礎となるシステムコールの機能です。これはPOSIX仕様で明示的に言及されています。
² 現在、これを行うには、実行jobs -l
してプロセスグループIDを含むジョブのリストを表示し、次にプロセスグループkill -123 -456 …
を強制終了します。
/bin/kill
またはシェル組み込みですか?後者の場合、シェルは独自の組み込みでそれ自体を殺すことはないと思います。