web-dev-qa-db-ja.com

トラップコマンドの信号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をトラップするのかわかりません。 man 7 signal によると、そのような信号はありません。

これは単なるタイプミスかバグですか、それとも本当に何かを達成していますか?

12
Christoph Wurm

bashマニュアル から:

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

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

19
Mat

@Matが彼の回答で示しているように、trapコマンドでSIGSPECを使用すると、スクリプトの終了時に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は、シグナル0がtrapコマンドにリストされている場合でも、プロセスを強制終了しません。

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

ただし、シグナル1を使用してスクリプトをkillした場合、kill -1

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

スクリプトが終了し、メッセージ "hi"が2回出力されることがわかります。 1つ目はシグナル1、2つ目はスクリプトが終了したためです。

$ ./tr.bash 
PID: 24086
hi
hi
1
slm

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

tmp =/tmp/myscript。$$

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

do_a_bunch_of_stuff

出口

トラップの最後の出口は、クリーンアップ時に正しいステータスでシェルを終了します。

0
dbrower