押すと Ctrl+C 最初のスクリプトでは、期待どおりに機能します。 Ctrl+C 効果はありません
#!/bin/bash
trap '' INT
ssh user@server 'svn checkout ...'
echo "done"
しかし、2番目のスクリプトでは Ctrl+C どういうわけかSSH接続を終了し、スクリプトの次の部分に進みます
#!/bin/bash
trap 'echo "message"' INT
ssh user@server 'svn checkout ...'
echo "done"
2番目のスクリプトで考えました Ctrl+C SSH接続を終了せずに、コンソールに「メッセージ」のみを出力する必要があります。なんでこんなことが起こっているの?毎回メッセージを印刷することは可能ですか? Ctrl+Cssh
を終了せずに押されましたか?
''
のtrap '' <signame>
は特別です。これにより、<signame>
は無視され、ダミーハンドラーにバインドされません。
シグナルの「無視」処理は子プロセス(sshなど)に継承されますが、シグナルハンドラーは継承されません。
trap '' INT
はtrap true INT
またはtrap ' ' INT
と同じではありません。
help trap
in bashは、次のように語っています。
ARG
がnull文字列の場合、各SIGNAL_SPEC
は無視されますシェルとそれが呼び出すコマンドによってです。
本当にやりたいことを伝えるのは難しいですが、を押したときにスクリプトにメッセージを出力させたいだけの場合 Ctrl-C、ssh
コマンドを終了しないと、次のようになります。
#!/bin/bash
trap 'echo "message"' INT
ssh user@server 'svn checkout ...' &
while :; do
wait
s=$?
case $s in
130) ;;
129|13?) kill -n "$((s - 128))" "$$";;
*) exit "$s";;
esac
done
echo "done"
それでもスクリプトを強制終了できるようにする場合は、ssh ... &
を(trap - QUIT; trap '' INT; exec ssh ...) &
に変更します。 Ctrl-\ (SIGQUIT
)。