web-dev-qa-db-ja.com

bashスクリプトのCtrl-Cトラップによるsshの終了

押すと 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を終了せずに押されましたか?

1
Sergey

''trap '' <signame>は特別です。これにより、<signame>無視され、ダミーハンドラーにバインドされません。

シグナルの「無視」処理は子プロセス(sshなど)に継承されますが、シグナルハンドラーは継承されません。

trap '' INTtrap true INTまたはtrap ' ' INTと同じではありません。

help trap in bashは、次のように語っています。

ARGnull文字列の場合、各SIGNAL_SPEC無視されますシェルとそれが呼び出すコマンドによってです。


本当にやりたいことを伝えるのは難しいですが、を押したときにスクリプトにメッセージを出力させたいだけの場合 Ctrl-Csshコマンドを終了しないと、次のようになります。

#!/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)。

1
user414777