答案1
答案2
正如 @Mat 在他的回答中所示,当在命令上使用 SIGSPEC 0 时,trap
将导致trap
命令在脚本退出时运行。
这个例子说明了会发生什么。
$ cat tr.bash
#!/bin/bash
echo "PID: $$"
trap 'echo hi; exit 1' 0 1 2 15
while [ 1 ]; do
sleep 3
done
当我们运行这个时:
$ ./tr.bash
PID: 24086
它坐在这里无限期地等待。在另一个窗口中,如果我们现在kill
向它发送信号,您将看到 akill -0
不会终止该进程,即使trap
命令中列出了信号 0。
$ kill -0 $(pgrep tr.bash)
$
但是,如果我们kill
使用信号 1 编写脚本kill -1
:
$ kill -1 $(pgrep tr.bash)
$
我们将看到脚本退出,并打印消息“hi”两次。第一个用于信号 1,第二个用于脚本退出。
$ ./tr.bash
PID: 24086
hi
hi
答案3
trap on 0 在 shell 退出时运行。它通常用于清理始终执行的一个地方的 tmp 文件:
tmp=/tmp/myscript.$$
陷阱‘rm -f $tmp;退出’0 1 2 15
做一堆东西
出口
陷阱末尾的出口在清理时以正确的状态退出 shell。