中間段階でCtrl + Cを送信した後でも、コマンドシーケンスを実行することはできますか?

中間段階でCtrl + Cを送信した後でも、コマンドシーケンスを実行することはできますか?

プログラムがありますが、それと呼びましょうxcommand。実行すると標準出力はありませんが、出力をファイルに書き込みます。

私が達成したいのは、実行後のxcommand実行プロセス中にリアルタイムで出力を見たいと思います。例外が見つかったら、出力を閉じて同時に復元しますxcommand

たとえば、私が書いたbashスクリプトでいくつかの方法を試しました。

xcommand &
tail -f outputfile
fg

しかし、問題は、を押すとctrl+cすべてが停止することです。そしてfgまったく実行されていません。

それで、私が望む効果を得ることができますか?

ベストアンサー1

非対話型(スクリプトなど)の場合、シェルはジョブ制御を実行しません。非同期操作をバックグラウンドに置かないでください。これらはスクリプトの残りの部分と同じプロセスグループに残るため、Ctrl-Cを押すとSIGINTがそのプロセスグループに送信されます(スクリプト自体がフォアグラウンドで実行されていると仮定)。

set -mシェルに非対話型ジョブ制御を提供するコマンドを実行できます。

#! /bin/bash -
set -m
xcommand & # start as a background job, so won't receive SIGINT upon ^C
tail -f outputfile # start in foreground. Will receive SIGINT.
fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT

機能するには、スクリプトを前景から開始する必要があります。また、Ctrl-Z を押すか、バックグラウンド ジョブが端末からデータを読み取ろうとすると、問題が発生することがあります。

私の経験では、この技術は「働く」bashまたは、yash通常、他のBourneと同じシェルではありません。

おすすめ記事