Echo des Fortschritts eines Hintergrundprozesses ohne Hijacking-Eingabeaufforderung

10

Betrachten Sie das einfache Skript hello:

#!/bin/bash

echo 'hello world!'

Nun von Bash, wenn ich versuche, dies im Hintergrund auszuführen:

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

Was ich lieber sehen würde:

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

Wie kann ich das Verhalten ändern?

Dave Johnson
quelle

Antworten:

13

Es ist eine Frage des Timings: bash startet den helloBefehl im Hintergrund, zeigt dann eine Eingabeaufforderung an, mit der Sie einen neuen Befehl eingeben können, und der Hintergrundbefehl gibt eine Ausgabe aus. Wenn Sie die nächste Befehlszeile eingeben (eine leere Befehlszeile, wenn Sie nur drücken Enter), zeigt bash die Benachrichtigung an, dass der Hintergrundjob beendet wurde, und dann die nächste Eingabeaufforderung.

Möglicherweise möchten Sie mit einem Skript experimentieren, das mit dem sleep 3Schreiben beginnt, und direkt nach dem Starten des Skripts im Hintergrund mit der Eingabe beginnen, um zu sehen, was in einem Tempo geschieht, dem Sie folgen können.

Sie können Bash Sie sofort benachrichtigen lassen, wenn ein Hintergrundjob beendet wird, indem Sie die notifyOption mit festlegen set -b. Dann werden Sie sehen:

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

Bash zeichnet die Eingabeaufforderung in diesem Fall nicht neu. Sie bearbeiten immer noch eine Befehlszeile in der Eingabeaufforderungszeile, die vor dem Drucken des Hintergrundjobs angezeigt wurde hello world!. Sie können die aktuelle Zeile durch Drücken von Esc 1 Ctrl+ neu zeichnen L. Möglicherweise möchten Sie den Befehl redraw-current-linean eine bequemere Taste binden . beispielsweise haben Ctrl+ Ldie aktuelle Zeile neu zu zeichnen und Ctrl+ Alt+ Lden Bildschirm löschen, fügen Sie die folgenden Zeilen in ~/.inputrc:

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

Ich kenne keine Möglichkeit, Bash dazu zu bringen, die Eingabeaufforderungszeile automatisch neu zu zeichnen. Zsh macht es standardmäßig.

Gilles 'SO - hör auf böse zu sein'
quelle