簡単なスクリプトを検討してください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はデフォルトでこれを行います。