Le flux "salut" est imprimé dans mon invite (dans le stdin
) et non dans monstdout
Non, ce n'est pas "imprimé dans votre stdin
".
Si vous appuyez sur retour, il n'essaiera pas de s'exécuter en hi
tant que commande. C'est juste que l'arrière-plan echo
imprimé hi
tandis que le curseur était après votre invite.
Vous souhaitez peut-être imprimer une nouvelle ligne de tête , comme (sleep 1m && echo -e '\nhi' &)
. (Ajustez si nécessaire pour le echo
dans votre coque. Ou utilisez printf
pour la portabilité.)
J'ai mis l' &
intérieur du sous-shell pour "renier" le travail en arrière-plan, donc vous évitez également le "bruit" de [1]+ Done
. Avec &&
entre les commandes, &
s'applique à l'ensemble de la chaîne de commandes composées, de sorte qu'il revient immédiatement à l'invite du shell au lieu d'attendre la sleep
sortie comme vous le feriez avec(sleep 1; echo ... &)
Voici ce qui se passe (avec 1 seconde de retard):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash ne sait pas que echo
quelque chose a été imprimé, il ne sait donc pas qu'il doit réimprimer son invite ou nettoyer l'écran. Vous pouvez le faire manuellement avec control-L
.
Vous pouvez écrire une fonction shell qui obtient bash pour réimprimer son invite une fois echo
terminé . Faire juste echo "$PS1"
ne reproduira aucun caractère déjà tapé. kill -WINCH $$
sur mon système obtient bash pour réimprimer sa ligne d'invite sans effacer l'écran, en laissant hi
une ligne seule avant l'invite. SIGWINCH est envoyé automatiquement lorsque la taille de WINdow CHANGE, et la réponse de bash se produit pour faire ce que nous voulons.
Cela pourrait fonctionner avec d'autres shells, mais je n'essaye pas de rendre ce 100% portable / POSIX. ( Malheureusement, cela ne fonctionne que sur bash4.4, pas bash4.3, ou dépend d'un paramètre que je ne connais pas )
# 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`
Vous pouvez facilement envelopper cela dans une fonction shell qui prend un argument de sommeil et un message.
bash 4.3 ne réimprime pas son invite après SIGWINCH, donc cela ne fonctionne pas là-bas. J'ai shopt -s checkwinsize
activé sur les deux systèmes, mais cela ne fonctionne que sur le système Bash 4.4 (Arch Linux).
Si cela ne fonctionne pas, vous pouvez essayer (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, qui "fonctionne" si la ligne de commande est vide. (Il ignore également la possibilité PROMPT_COMMAND
définie.)
Il n'y a pas de moyen vraiment propre de mélanger la sortie du terminal avec tout ce que vous pourriez faire sur votre terminal plus tard, lorsque le minuteur se déclenche. Si vous êtes en train de faire défiler quelque chose less
, vous pouvez facilement le manquer.
Si vous cherchez quelque chose avec des résultats interactifs, je vous suggère de lire un fichier audio. par exemple avec un lecteur en ligne de commande comme mpv
(nice fork de MPlayer2). Ou choisissez un fichier vidéo pour qu'une nouvelle fenêtre s'ouvre.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Vous voudrez peut-être echo
ouvrir un nouveau terminal xterm / konsole / gnome. Utilisez une option qui maintient le terminal ouvert après la fin de la commande.