ハイジャックプロンプトなしでバックグラウンドプロセスの進行状況をエコーし​​ます。

ハイジャックプロンプトなしでバックグラウンドプロセスの進行状況をエコーし​​ます。

簡単なスクリプトを検討してくださいhello

#!/bin/bash

echo 'hello world!'

ここでbashでバックグラウンドで実行しようとすると、次のようになります。

$ hello &
[1] 12345
$ hello world!
█ <--- prompt is stuck here until I hit enter!
[1]+ Done
$ █ <--- prompt back to normal

私が見たいのは次のとおりです。

$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$ █ <--- prompt normal the whole time

この動作をどのように変更できますか?

答え1

タイミングの問題です。 bash はhelloバックグラウンドでコマンドを開始し、新しいコマンドを入力するよう求めるプロンプトを出し、バックグラウンド・コマンドが出力を出力します。次のコマンドライン(単に押すと空のコマンドラインEnter)を入力すると、bashはバックグラウンドジョブが完了したことを示す通知を表示し、次のプロンプトを表示します。

次のスクリプトを試して、sleep 3スクリプトがバックグラウンドで実行されるとすぐに入力を開始して、続行できる速度で何が起こるかを確認することをお勧めします。

notifyオプションを設定することで、バックグラウンドジョブが終了したときにbashにすぐに通知を受け取ることができます。set -b。これにより、以下が表示されます。

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

この場合、Bashはプロンプトを再描画しません。スプールジョブが印刷される前に表示されるプロンプトで、まだコマンドラインを編集していますhello world!Esc 1 Ctrl+を押して現在の行を再描画できますL。コマンドをredraw-current-lineより便利なキーにバインドできます。たとえば、現在の行をCtrl再描画して画面を消去するには、次の行をに追加します。LCtrlAltL~/.inputrc

"\C-l": redraw-current-line
"\e\C-l": clear-screen

bashが自動的にプロンプ​​ト行を再描画する方法を知りません。 Zshはデフォルトでこれを行います。

関連情報