La secuencia "hola" se imprime en mi mensaje (en el stdin
) y no en mistdout
No, es no "impreso en su stdin
".
Si presionó Intro, no intentaría ejecutarse hi
como un comando. Es solo que el fondo se echo
imprimió hi
mientras el cursor estaba después de su solicitud.
Quizás desee imprimir una nueva línea principal , como (sleep 1m && echo -e '\nhi' &)
. (Ajuste según sea necesario para el echo
en su shell. O use printf
para la portabilidad).
Puse el &
interior del subshell para "rechazar" el trabajo en segundo plano, para que también evite el "ruido" de [1]+ Done
. Con &&
entre los comandos, se &
aplica a toda la cadena de comandos compuestos, por lo que vuelve al indicador de comandos de inmediato en lugar de esperar sleep
a salir como lo haría con(sleep 1; echo ... &)
Esto es lo que sucede (con 1 segundo de retraso):
peter@volta:~$ (sleep 1 && echo -e '\nhi' &)
peter@volta:~$
hi
# cursor is at the start of this empty line.
Bash no sabe que echo
imprimió algo, por lo que no sabe que necesita volver a imprimir su mensaje o limpiar la pantalla. Puede hacerlo manualmente con control-L
.
Podría escribir una función de shell que obtenga bash para volver a imprimir su solicitud después de echo
finalizar . Hacerlo echo "$PS1"
no reproducirá ningún carácter ya escrito. kill -WINCH $$
en mi sistema, bash vuelve a imprimir su línea de aviso sin borrar la pantalla, dejando hi
una línea sola antes del aviso. SIGWINCH se envía automáticamente cuando el tamaño de WINdow cambia, y la respuesta de bash hace lo que queremos.
Puede funcionar con otros shells, pero no estoy tratando de hacer que este sea 100% portátil / POSIX. ( Desafortunadamente, esto solo funciona en bash4.4, no bash4.3, o depende de alguna configuración que desconozco )
# 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`
Podría envolver esto fácilmente en una función de shell que toma un argumento de suspensión y un mensaje.
bash 4.3 no vuelve a imprimir su solicitud después de SIGWINCH, por lo que esto no funciona allí. He shopt -s checkwinsize
habilitado en ambos sistemas, pero solo funciona en el sistema Bash 4.4 (Arch Linux).
Si no funciona, puede intentarlo (sleep 2 && echo -e '\nhi' && echo "$PS1" &)
, lo que "funciona" si la línea de comando está vacía. (También ignora la posibilidad que PROMPT_COMMAND
se establece).
No hay una forma realmente limpia de hacer que la salida del terminal se mezcle con lo que sea que esté haciendo en su terminal más tarde, cuando se dispara el temporizador. Si estás en medio de desplazarte por algo less
, podrías pasarlo por alto fácilmente.
Si está buscando algo con resultados interactivos, le sugiero que reproduzca un archivo de audio. por ejemplo, con un jugador de línea de comandos como mpv
(buen fork de MPlayer2). O elija un archivo de video para que se abra una nueva ventana.
(sleep 1 && mpv /f/share/music/.../foo.ogg </dev/null &>/dev/null &)
Es posible que desee echo
abrir un nuevo xterm / konsole / gnome-terminal. Use una opción que mantenga el terminal abierto después de que salga el comando.