最初のスクリプトで+を押すと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 '' INT
trap 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