Haciendo eco del progreso de un proceso en segundo plano sin un aviso de secuestro

10

Considere la secuencia de comandos simple hello:

#!/bin/bash

echo 'hello world!'

Ahora desde bash si intento ejecutar esto en segundo plano:

$ hello &
[1] 12345
$ hello world!
 <--- prompt is stuck here until I hit enter!
[1]+ Done
$  <--- prompt back to normal

Lo que preferiría ver:

$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$  <--- prompt normal the whole time

¿Cómo puedo cambiar el comportamiento?

Dave Johnson
fuente

Respuestas:

13

Es cuestión de tiempo: bash inicia el hellocomando en segundo plano, luego muestra un mensaje que le permite ingresar un nuevo comando, luego el comando en segundo plano imprime algunos resultados. Cuando ingresa la siguiente línea de comando (una línea de comando vacía, si solo presiona Enter), bash muestra la notificación de que el trabajo en segundo plano ha finalizado, luego el siguiente mensaje.

Es posible que desee experimentar con un script que comience sleep 3y comience a escribir justo después de iniciar el script en segundo plano, para ver qué sucede a un ritmo que pueda seguir.

Puede hacer que bash le notifique de inmediato cuando finalice un trabajo en segundo plano configurando la notifyopción con set -b. Entonces verás:

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

Bash no vuelve a dibujar el indicador en este caso. Todavía está editando una línea de comando en la línea de solicitud que apareció antes de que se imprimiera el trabajo en segundo plano hello world!. Puede volver a dibujar la línea actual presionando Esc 1 Ctrl+ L. Es posible que desee vincular el comando redraw-current-linea una tecla más conveniente; por ejemplo, para que Ctrl+ Lvuelva a dibujar la línea actual y Ctrl+ Alt+ Lborre la pantalla, agregue las siguientes líneas a su ~/.inputrc:

"\C-l": redraw-current-line
"\e\C-l": clear-screen

No conozco una manera de hacer que bash vuelva a dibujar la línea de solicitud automáticamente. Zsh lo hace por defecto.

Gilles 'SO- deja de ser malvado'
fuente