Cómo suprimir el mensaje terminado después de matar en bash?

¿Cómo se puede suprimir el mensaje Terminated que aparece después de matar un proceso en un script bash?

Intenté set +bm , pero eso no funciona.

Sé que otra solución implica llamar a exec 2> /dev/null , pero ¿es eso confiable? ¿Cómo lo reinicio para poder continuar viendo stderr?

La respuesta corta es que no puedes. Bash siempre imprime el estado de los trabajos en primer plano. El indicador de supervisión solo se aplica a trabajos en segundo plano, y solo para shells interactivos, no scripts.

ver notify_of_job_status () en jobs.c.

Como dices, puedes redirigir para que el error estándar apunte a / dev / null pero luego pierdes cualquier otro mensaje de error. Puede hacerlo temporal al hacer la redirección en una subshell que ejecuta el script. Esto deja el entorno original solo.

 (script 2> /dev/null) 

que perderá todos los mensajes de error, pero solo desde ese script, no desde cualquier otra cosa que se ejecute en ese shell.

Puede guardar y restaurar el error estándar redirigiendo un nuevo descriptor de archivo para que apunte allí:

 exec 3>&2 # 3 is now a copy of 2 exec 2> /dev/null # 2 now points to /dev/null script # run script with redirected stderr exec 2>&3 # restre stderr to saved exec 3>&- # close saved version 

Pero no recomendaría esto: la única ventaja de la primera es que guarda una invocación de subconjunto, a la vez que es más complicado y, posiblemente, incluso altera el comportamiento de la secuencia de comandos, si la secuencia de comandos altera los descriptores de archivo.


EDITAR:

Para una respuesta de verificación de respuesta más apropiada dada por Mark Edgar

Para silenciar el mensaje, debe estar redireccionando stderr en el momento en que se genera el mensaje . Como el comando kill envía una señal y no espera a que el proceso objective responda, redireccionar el stderr del comando kill no sirve. La wait interna de bash se hizo específicamente para este propósito.

Aquí hay un ejemplo muy simple que mata el comando de fondo más reciente. (¡ Aprenda más sobre $! Aquí ) .

 kill $! wait $! 2>/dev/null 

Como ambos kill y wait aceptar múltiples pids, también puedes matar por lotes. Aquí hay un ejemplo que mata todos los procesos en segundo plano (del proceso / script actual, por supuesto).

 kill $(jobs -rp) wait $(jobs -rp) 2>/dev/null 

Fui guiado aquí desde Bash: silenciosamente mato el proceso de función de fondo .

Inspirado por la respuesta de MarcH . Estaba usando kill -INT como sugiere con cierto éxito, pero noté que no estaba matando algunos procesos. Después de probar algunas otras señales, veo que SIGPIPE también matará sin un mensaje.

 kill -PIPE 

o simplemente

 kill -13 

Solución: use SIGINT (funciona solo en shells no interactivos)

Manifestación:

 cat > silent.sh < <"EOF" sleep 100 & kill -INT $! sleep 1 EOF sh silent.sh 

http://thread.gmane.org/gmane.comp.shells.bash.bugs/15798

¿Tal vez desconectar el proceso del proceso de shell actual llamando ” disown ?

¿Es esto lo que todos estamos buscando?

No deseado:

 $ sleep 3 & [1] 234  $ $ [1]+ Done sleep 3 $ 

Querido:

 $ (set +m; sleep 3 &)  $ $ $ $ $ 

Como puede ver, no hay mensaje de final de trabajo. Funciona para mí en scripts bash también, también para procesos de fondo muertos.

‘set + m’ deshabilita el control del trabajo (ver ‘help set’) para el shell actual. Por lo tanto, si ingresa su comando en una subcadena (como se hace aquí entre paréntesis), no influirá en la configuración de control de trabajos del shell actual. La única desventaja es que debe volver a enviar el pid del proceso en segundo plano al shell actual si desea comprobar si ha finalizado o evaluar el código de retorno.

Esto también funciona para killall (para aquellos que lo prefieran):

killall -s SIGINT (su progtwig)

suprime el mensaje … Estaba ejecutando mpg123 en modo de fondo. Solo se puede matar silenciosamente enviando un ctrl-c (SIGINT) en lugar de un SIGTERM (predeterminado).

Otra forma de desactivar las notificaciones de trabajo es colocar su comando en una construcción sh -c 'cmd &' .

 #!/bin/bash # ... pid="`sh -c 'sleep 30 & echo ${!}' | head -1`" kill "$pid" # ... # or put several cmds in sh -c '...' construct sh -c ' sleep 30 & pid="${!}" sleep 5 kill "${pid}" ' 

el rechazo hizo exactamente lo correcto para mí – el ejecutor 3> & 2 es arriesgado por muchas razones – set + bm no pareció funcionar dentro de un script, solo en el símbolo del sistema

Tuve éxito agregando ‘ jobs 2>&1 >/dev/null ‘ a la secuencia de comandos, no estoy seguro si esto ayudará a la secuencia de comandos de otra persona, pero aquí hay una muestra.

  while true; do echo $RANDOM; done | while read line do echo Random is $line the last jobid is $(jobs -lp) jobs 2>&1 >/dev/null sleep 3 done 

Sencillo:

{matar $! } 2> / dev / null

Ventaja? puede usar cualquier señal

ex: {kill -9 $ PID} 2> / dev / null

Encontré que poner el comando kill en una función y luego crear un fondo de la función suprime la salida de terminación

 function killCmd() { kill $1 } killCmd $somePID &