バックグラウンドプロセスが完了すると、シェルは自動的に通知できますか?

バックグラウンドプロセスが完了すると、シェルは自動的に通知できますか?

私は自分のMacのbash端末でGNU / Linuxスタイルのコマンドとツールを自分で学びたいです。

バックグラウンドプロセスが完了したら、端末が自動的に表示されるようにしたいと思います。特定のプログラムを実行していませんが、たとえば次のようになります。

sleep 10 &

sleepタスクが完了したらコマンドラインに自動的に表示されるようにするにはどうすればよいですか(または可能ですか)。それとも手動で確認する必要がありますか?

答え1

set +b


基本モード。このモードでは、bashプロンプトが印刷されるたびに最初にバックグラウンドジョブが停止または終了したことを確認し、停止または終了した場合にプロンプ​​トを表示する前に通知メッセージを印刷します。

set +bモニターは損傷しませんが、独自の問題があります。特に、別のエディタウィンドウでソースコードを編集しているGUIプログラムをテストしているとします。 (通訳された言語で書かれているとします。)おそらく同じコマンドを入力し続ける端末ウィンドウがありますmyprogram &。プログラムを変更して再起動したいときはいつでも、現在のインスタンスを閉じてこのコマンドを繰り返す必要があります。シェルウィンドウで。以前のプログラムが完了したという通知を印刷する前に、プログラムの新しいインスタンスがbash起動します。その通知を印刷することは、ジョブ番号の割り当てがリセットされる瞬間であるため、意図的にジョブ番号がリセットされない限り、ジョブ番号が制限なく増加することを意味します。バックグラウンドなしで実行ジョブの実行中にEnterキーを押します。最終的には、プログラムインスタンスが中断され、意図したものkill %134よりも多くの内容を入力する必要がありますkill %1


set -b


このモードでは、バックグラウンドジョブが停止または終了するとbashSIGCHLD信号を受信し、そのシグナルハンドラはbash現在のフォアグラウンドプロセスが完了するのを待っている場合でもすぐに通知メッセージを表示します。

set -b端末の状態は不明であるため、通知により実行中のフルスクリーンアプリケーション(テキストエディタやMUAなど)の表示が中断される可能性があります。特に、このモードはbash独自のコマンドラインエディタと賢明に対話することはできません!このモードで実行して、sleep 1 &すぐにコマンドライン入力を開始してください。通知が印刷されると、ディスプレイが目立たない状態であることがわかります。


その源がすべて明らかになったここ

答え2

デフォルトでは、bashこれは通常、コマンドプロンプトが表示される準備ができたときにバックグラウンドジョブの状態が変更されたことを知らせるように設定されます。

この同期通知を非同期で有効にできますset -b。しかし、欠点がないわけではありません。たとえば、現在コマンドを入力している場合、カーソル行の位置に関する概念はありません。

しかし、コマンドラインツールを学ぶとき、MacにインストールされているツールとGNU / Linuxディストリビューションに同じ名前のツールの間に微妙な(時にはあまり微妙ではない)違いがあることに注意してください。

関連情報