bash -c "sleep 5; echo 'test'"
上記のコマンドを実行してCTRL-C
を押すと、sleep 5
プロセス全体が終了してecho 'test'
表示されません。
上記のコマンドを実行してsleep
コマンド処理SIGINT
(CTRL-C
)を許可するにはどうすればよいですか?
SIGINT
内部コマンドではなくbashプロセスだと思いますか?
答え1
bash
sleep
(および他のシェル)はジョブ制御なしでスクリプトを実行するため、^ Cは(すべて同じフォアグラウンドプロセスグループの一部であるため)だけでなく、スクリプト全体を終了します。
スクリプトで次のコマンドを使用してジョブ制御を有効にする必要がありますset -m
。
$ bash -c 'set -m; sleep 5; echo test'
^Ctest
$
または捕まえるSIGINT
スクリプトの信号:
$ bash -c 'trap : SIGINT; sleep 5; echo test'
^Ctest
$
:
代わりに注意''
してください。無視する、対応するサブプロセスはSIGINT
この設定を継承して無視します。
SIGINTが内部コマンドではなくbashプロセスに入ると思いますか?
両方に送信されます。 1VINTR
文字(^C
デフォルトでは)は、フォアグラウンドSIGINT
ジョブ(プロセスグループ)からすべてのプロセスにシグナルを送信します。