陷阱命令中的信号0是什么?


12

我正在遵循本指南,了解如何使用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。根据man 7信号,没有这样的信号。

这仅仅是错别字或错误,还是真的有成就?

Answers:


19

bash手册

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

...如果sigspec为EXIT(0),则从外壳退出时将执行命令arg。


13
正确。如果读者由于问题的标题而来这里,请注意,这是0shell trap命令中的含义。当发送带有的信号时kill,信号号0表示根本不发送信号;这是测试目标过程是否存在的一种方法。
吉尔(Gilles)“所以,别再邪恶了”,

@Mat:非常感谢。我正在读人1陷阱 ……
Christoph Wurm

1
但是它不在trap -l!输出的列表中
amphetamachine

您能否解决脚本来源问题?
艾里克

1

如@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信号,则kill -0即使trap命令中列出了信号0,您也会看到a 不会终止该进程。

$ kill -0 $(pgrep tr.bash)
$

但是,如果我们kill使用信号1编写脚本,则kill -1

$ kill -1 $(pgrep tr.bash)
$

我们将看到该脚本退出,并打印消息“ hi” 2次。第一个用于信号1,第二个用于信号退出。

$ ./tr.bash 
PID: 24086
hi
hi

0

当shell退出时,在0上运行trap。它通常用于在始终执行的一个位置清理tmp文件:

tmp = / tmp / myscript。$$

陷阱'rm -f $ tmp; 退出'0 1 2 15

do_a_bunch_of_stuff

出口

陷阱末端的出口在清理时以正确的状态退出外壳。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.