トラップコマンドの信号0は何ですか?

トラップコマンドの信号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

~からバッシュマニュアル:

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

...sigspecがEXIT(0)の場合、シェルを終了するとargコマンドが実行されます。

答え2

@Matが答えに示すように、コマンドにSIGSPEC 0を使用すると、スクリプトの終了時にコマンドが実行されますtraptrap

この例は、何が起こるかを示しています。

$ 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

それはここに座って無限に待っています。別のウィンドウでシグナルを送信すると、シグナル0がコマンドにリストされていても、killaがプロセスを終了しないことがわかります。kill -0trap

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

ただし、killシグナル1を使用してスクリプトを作成すると、次のようになりますkill -1

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

スクリプトの終了を確認し、「hi」メッセージを2回印刷します。 1 つ目はシグナル 1 用、2 番目はスクリプト終了用です。

$ ./tr.bash 
PID: 24086
hi
hi

答え3

シェルが終了すると、0のトラップが実行されます。通常、常に実行されている1つの場所でtmpファイルをクリーンアップするために使用されます。

tmp=/tmp/myscript.$$

トラップ 'rm -f $tmp;exit'0 1 2 15

これをたくさん作る

出口

トラップの端にある出口は、清掃時に正しい状態でシェルをシャットダウンします。

関連情報