Evitar que bash muestre "Listo" cuando un comando en segundo plano termina de ejecutarse

34

Si ejecuto un comando en segundo plano con &, como este:

sleep 2 &

cuando termina el comando, me aparece "Listo". ¿Cómo puedo evitar ver el mensaje "Listo"?

Juan Pablo
fuente

Respuestas:

34

Ejecute el comando en una subshell:

(sleep 2 &)
Wooble
fuente
tenga en cuenta que al usar esto, pierde el control de los trabajos dentro del shell de la persona que llama ( jobsno mostrará nada).
mighq
36

Ejecute el shell incorporado:

$ set +m

Esto funciona desactivando el "modo monitor" para que el shell no informe la finalización de trabajos en segundo plano.

Aunque ejecuta el comando en una subshell como:

$ (sleep 2&)

... también deshabilitará el mensaje, la única razón por la que funciona es porque el modo monitor está habilitado de manera predeterminada solo para shells interactivos. Es decir, el subshell evita el mensaje ejecutando un shell adicional que tiene un "set + m" automático .

DigitalRoss
fuente
44
Hay que tener en cuenta que esta salida no es realizada por el sueño. Es el shell bash que solo te informa sobre el trabajo de fondo terminado.
flolo
8

Me gustaría aclarar las dos respuestas anteriores. Si lo que quiere es nunca ver el mensaje Listo de ningún comando en su shell, ese set +mes el camino a seguir. Simplemente póngalo en su .profile y / o .bashrc y listo. Sin embargo, tenga en cuenta que si escribe esto:

set +m
sleep 2 &
set -m

y el sueño termina después de la final set -m, aún recibirá el mensaje hecho.

Si desea deshabilitar el mensaje para una invocación de comando único, la técnica de subshell (sleep 2 &)es el camino a seguir.

Con toda honestidad, solo lo sabía set +m, así que +1 a Wooble por iluminarme. Sin embargo, vale la pena señalar que cuál de las dos soluciones que desea depende de lo que está tratando de hacer.

andrewdski
fuente
0

Sin una subshell , puede hacer lo siguiente:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>-
    disown &>/dev/null  # Close STD{OUT,ERR} for silence if job has already completed
}

silent_background sleep 5

Basado en esta respuesta .

Tom Hale
fuente