trap 命令中的信号 0 是什么?

trap 命令中的信号 0 是什么?

我正在跟进本指南关于如何使用 ssh-agent 设置无密码 SSH 身份验证。

为了启动 ssh-agent,作者推荐使用以下代码.bash_profile

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

我不明白为什么它会捕获信号 0。根据男人7信号没有这样的信号。

这只是一个错字或错误还是这真的取得了一些成果?

答案1

来自bash手册:

trap [-lp] [[arg] sigspec ...]

...如果 sigspec 为 EXIT (0),则在退出 shell 时执行命令 arg。

答案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。

相关内容