Bashで '-c'パラメータを介して複数のコマンドを使用すると、奇妙な信号動作が発生しますか?

Bashで '-c'パラメータを介して複数のコマンドを使用すると、奇妙な信号動作が発生しますか?
bash -c "sleep 5; echo 'test'"

上記のコマンドを実行してCTRL-Cを押すと、sleep 5プロセス全体が終了してecho 'test'表示されません。

上記のコマンドを実行してsleepコマンド処理SIGINTCTRL-C)を許可するにはどうすればよいですか?

SIGINT内部コマンドではなくbashプロセスだと思いますか?

ベストアンサー1

bashsleep(および他のシェル)はジョブ制御なしでスクリプトを実行するため、^ 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ジョブ(プロセスグループ)からすべてのプロセスにシグナルを送信します。

おすすめ記事