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 によると、そのような信号はありません。
これは単なるタイプミスかバグですか、それとも本当に何かを達成していますか?
@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
シェルが終了すると、0のトラップが実行されます。通常、常に実行される1つの場所でtmpファイルをクリーンアップするために使用されます。
tmp =/tmp/myscript。$$
トラップ 'rm -f $ tmp;出口0 1 2 15
do_a_bunch_of_stuff
出口
トラップの最後の出口は、クリーンアップ時に正しいステータスでシェルを終了します。