Der "Hallo" -Stream wird in meiner Eingabeaufforderung (in der stdin
) und nicht in meiner gedrucktstdout
Nein, es ist nicht "gedruckt in Ihrem stdin
".
Wenn Sie die Eingabetaste drücken, wird nicht versucht, den hi
Befehl auszuführen . Es ist nur so, dass der Hintergrund echo
gedruckt wurde, hi
während sich der Cursor hinter Ihrer Eingabeaufforderung befand.
Vielleicht möchten Sie eine führende Zeile drucken , wie z (sleep 1m && echo -e '\nhi' &)
. (Passen Sie nach Bedarf die echo
in Ihrer Shell an. Oder verwenden Sie sie printf
für die Portabilität.)
Ich habe die &
Innenseite der Unterschale so eingestellt, dass der Hintergrundjob "verleugnet" wird, damit Sie auch das "Rauschen" von vermeiden [1]+ Done
. Wird &&
zwischen den Befehlen &
für die gesamte zusammengesetzte Befehlskette angewendet, sodass sofort zur Shell-Eingabeaufforderung zurückgekehrt wird, anstatt auf sleep
das Beenden zu warten , wie Sie es gewohnt sind(sleep 1; echo ... &)
Folgendes passiert (mit einer Verzögerung von 1 Sekunde):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash weiß nicht, dass echo
etwas gedruckt wurde, daher muss die Eingabeaufforderung nicht erneut gedruckt oder der Bildschirm aufgeräumt werden. Sie können das manuell mit tun control-L
.
Sie können eine Shell-Funktion schreiben, die bash abruft, um die Eingabeaufforderung nach echo
Beendigung erneut zu drucken . Wenn Sie dies tun, echo "$PS1"
werden keine bereits eingegebenen Zeichen reproduziert. kill -WINCH $$
Auf meinem System wird Bash angewiesen, die Eingabeaufforderungszeile erneut zu drucken, ohne den Bildschirm zu hi
löschen. Vor der Eingabeaufforderung wird eine eigene Zeile angezeigt. SIGWINCH wird automatisch gesendet, wenn sich die Größe von WINdow ändert, und die Antwort von bash darauf geschieht, was wir wollen.
Es könnte mit anderen Shells funktionieren, aber ich versuche nicht, diese zu 100% portabel / POSIX zu machen. ( Leider funktioniert dies nur mit bash4.4, nicht mit bash4.3, oder hängt von einer Einstellung ab, die mir nicht bekannt ist. )
# bash4.4
peter@volta:~$ (sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
peter@volta:~$ ljlksjksajflasdf dfas # typed in 2 seconds
hi
peter@volta:~$ ljlksjksajflasdf dfas # reprinted by Bash because of `kill -WINCH`
Sie können dies leicht in eine Shell-Funktion einschließen, die ein Schlafargument und eine Nachricht entgegennimmt.
bash 4.3 druckt seine Eingabeaufforderung nach SIGWINCH nicht erneut, daher funktioniert dies dort nicht. Ich habe shopt -s checkwinsize
auf beiden Systemen aktiviert, aber es funktioniert nur auf dem Bash 4.4-System (Arch Linux).
Wenn es nicht funktioniert, können Sie versuchen (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, was "funktioniert", wenn die Befehlszeile leer ist. (Es ignoriert auch die Möglichkeit, die festgelegt PROMPT_COMMAND
ist.)
Es gibt keine wirklich saubere Möglichkeit, die Terminalausgabe mit dem zu mischen, was Sie später auf Ihrem Terminal tun, wenn der Timer ausgelöst wird. Wenn Sie gerade einen Bildlauf durchführen less
, können Sie ihn leicht übersehen.
Wenn Sie nach etwas mit interaktiven Ergebnissen suchen, empfehle ich Ihnen, eine Audiodatei abzuspielen. zB mit einem Kommandozeilen-Player wie mpv
(nette Abzweigung von MPlayer2). Oder wählen Sie eine Videodatei aus, um ein neues Fenster zu öffnen.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Vielleicht möchten Sie echo
ein neues xterm / konsole / gnome-terminal öffnen. Verwenden Sie eine Option, mit der das Terminal nach dem Beenden des Befehls geöffnet bleibt.