BashスクリプトでCtrl-Cトラップを使用してSSHを終了する

BashスクリプトでCtrl-Cトラップを使用してSSHを終了する

最初のスクリプトで+を押すとCtrl期待どおりに機能しますが、+は効果がありません。CCtrlC

#!/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"

Ctrl私の考えでは、2番目のスクリプトでは、CSSH接続を終了せずに「メッセージ」をコンソールに印刷する必要があると思います。なぜこれが起こるのですか?終了せずに+を押すたびにいくつかのCtrlメッセージを印刷できますか?Cssh

答え1

内部は''とても特別ですtrap '' <signame>。結果は<signame>次のとおりです。無視される、仮想ハンドラにバインドされていません。

シグナルの「無視」処理は、子プロセス(たとえばsshを介して)に継承されますが、シグナルハンドラには継承されません。

trap '' INTtrap true INTとは異なる、または異なりますtrap ' ' INT

help trapこれはbashで次のことを伝えます。

ARG場合空の文字列みんな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

関連情報