sleep 1 & kill -9 $?
以上将杀死(最有可能)巴什shell 或当前终端窗口。
这是为什么?
注意:sleep 1 & kill $?
不会杀死 shell/终端。
只是为了确保我不会运行与我的想法不同的东西,有一些竞争条件等,以下也会产生相同的效果:
/bin/sleep 2 & pid=$?; sleep 1; kill -9 $pid
GNU bash,版本 5.0.3(1)-发布
答案1
$?
是最后一个命令的退出状态。启动后台命令总是会成功,因此在 中… & do_something_with $?
, 的值为$?
0。您正在运行kill -9 0
。
PID 传递给kill
会向下传递给底层系统调用。 Shell 手册没有记录它可以是 PID 以外的东西,但是系统调用手册确实如此。如果PID为0,则表示当前进程中的所有进程进程组。 (-1 表示除 PID 1 之外的每个进程,另一个负值表示指定进程组中的每个进程。)在终端中运行的 shell 位于其自己的进程组中(除非您经过大量的循环或存在子 shell不在后台作业中),所以kill -9 0
相当于kill -9 $$
:它杀死了 shell 进程。
任何后台进程(例如sleep
命令)都会继续运行。它没有收到信号,外壳甚至没有机会发送信号。终端的死亡通常也不会影响它,尽管有些程序如果尝试写入关闭的终端可能会出错(当然这是sleep
不行的)。
kill 0
发送 TERM 信号,shell 会忽略该信号。kill -9 0
发送KILL信号,该信号不能被忽略。
如果您想终止最近的后台进程,那就是$!
.