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 hiBefehl auszuführen . Es ist nur so, dass der Hintergrund echogedruckt wurde, hiwä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 echoin Ihrer Shell an. Oder verwenden Sie sie printffü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 sleepdas 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 echoetwas 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 echoBeendigung 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 hilö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 checkwinsizeauf 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_COMMANDist.)
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 echoein neues xterm / konsole / gnome-terminal öffnen. Verwenden Sie eine Option, mit der das Terminal nach dem Beenden des Befehls geöffnet bleibt.