プロンプトをハイジャックせずにバックグラウンドプロセスから進行状況をエコー


10

簡単なスクリプトを考えてみましょう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

動作を変更するにはどうすればよいですか?

回答:


13

これはタイミングの問題です。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+ L現在の行を再描画し、Ctrl+ Alt+ Lあなたに以下の行を追加し、画面をクリアします~/.inputrc

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.