トラップコマンドの信号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をトラップされて、私は理解していない男性7信号はそのような信号がありません。

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

回答:


19

bashマニュアルから:

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

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


13
正しい。質問のタイトルのために読者がここに来た場合、これは0シェルtrapコマンドの意味であることに注意してください。でシグナルを送信する場合kill、シグナル番号0はシグナルを送信しないことを意味します。これは、ターゲットプロセスの存在をテストする方法です。
Gilles「SO-邪悪なことをやめなさい」

@マット:ありがとうございました。私は男1の罠を読んでいた...
クリストフ・ワーム

1
しかし、それはtrap -l!が出力するリストにはありません。
amphetamachine '25

スクリプトが提供されている場合に対処できますか?
エリック

1

@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 -0trapコマンドにシグナル0がリストされていても、a がプロセスを強制終了しないことがわかります。

$ 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

0

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

tmp = / tmp / myscript。$$

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

do_a_bunch_of_stuff

出口

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.