Il flusso "hi" viene stampato nel mio prompt (nel stdin
) e non nel miostdout
No, non è "stampato nel tuo stdin
".
Se si preme return, non proverà ad essere eseguito hi
come comando. È solo che lo sfondo echo
stampato hi
mentre il cursore era dopo il tuo prompt.
Forse vuoi stampare una nuova riga principale , come (sleep 1m && echo -e '\nhi' &)
. (Regola secondo necessità per la echo
tua shell. O usa printf
per la portabilità.)
Ho messo l' &
interno della sotto-shell per "rinnegare" il lavoro in background, in modo da evitare anche il "rumore" di [1]+ Done
. Con &&
tra i comandi, si &
applica all'intera catena di comandi composti, quindi ritorna immediatamente al prompt della shell invece di aspettare sleep
che esca come si otterrebbe(sleep 1; echo ... &)
Ecco cosa succede (con 1 secondo di ritardo):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash non sa che ha echo
stampato qualcosa, quindi non sa che deve ristampare il suo prompt o ripulire lo schermo. Puoi farlo manualmente con control-L
.
È possibile scrivere una funzione shell che ottiene bash per ristampare il suo prompt al echo
termine . Fare semplicemente echo "$PS1"
non riprodurrà alcun personaggio già digitato. kill -WINCH $$
sul mio sistema ottiene bash per ristampare la sua riga di prompt senza cancellare lo schermo, lasciando hi
su una riga da sola prima del prompt. SIGWINCH viene inviato automaticamente quando la dimensione di WINdow cambia, e la risposta di bash accade per fare ciò che vogliamo.
Potrebbe funzionare con altre shell, ma non sto cercando di creare questo POSIX / portatile al 100%. ( Sfortunatamente, questo funziona solo su bash4.4, non bash4.3 o dipende da alcune impostazioni di cui non sono a conoscenza )
# 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`
Potresti facilmente riassumerlo in una funzione shell che accetta un argomento sleep e un messaggio.
bash 4.3 non ristampa il suo prompt dopo SIGWINCH, quindi questo non funziona lì. Ho shopt -s checkwinsize
abilitato su entrambi i sistemi, ma funziona solo sul sistema Bash 4.4 (Arch Linux).
Se non funziona, puoi provare (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, che "funziona" se la riga di comando è vuota. (Ignora anche la possibilità che PROMPT_COMMAND
è impostata.)
Non c'è un modo davvero pulito per far sì che l'output del terminale si mescoli con qualsiasi cosa tu possa fare sul tuo terminale in seguito, quando il timer scatta. Se sei nel mezzo dello scorrimento di qualcosa less
, potresti facilmente perderlo.
Se stai cercando qualcosa con risultati interattivi, ti suggerisco di riprodurre un file audio. ad esempio con un giocatore a riga di comando come mpv
(bel fork di MPlayer2). Oppure scegli un file video per aprire una nuova finestra.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Potresti voler echo
aprire un nuovo terminale xterm / konsole / gnome. Utilizzare un'opzione che mantiene aperto il terminale dopo la chiusura del comando.