Aquí se explica cómo hacerlo en ambos {ba,z}sh
.
El uso de una función ayuda a no tener que guardar y restaurar el estado de zsh
la monitor
variable mediante el uso de setopt local_options
.
# Run the command given by "$@" in the background
silent_background() {
if [[ -n $ZSH_VERSION ]]; then # zsh: /superuser//a/1285272/365890
setopt local_options no_notify no_monitor
"$@" &
elif [[ -n $BASH_VERSION ]]; then # bash: /programming//a/27340076/5353461
{ 2>&3 "$@"& } 3>&2 2>/dev/null
else # Unknownness - just background it
"$@" &
fi
}
Usando esto de la siguiente manera:
trap 'echo child done' CHLD
silent_background sleep 1
Producirá el child done
mensaje esperado .
La redirección de la salida del comando parece ser irrelevante porque el shell envía la notificación cuando se inicia un trabajo de forma asincrónica. Más precisamente, es una función de shell (funcionalidad) relacionada con el control del trabajo .
Aquí, una cita que proviene del "Manual de referencia de Bash", capítulo "Control de trabajos", sección uno.
Tenga en cuenta que un script de shell no muestra esta notificación.
En hechos
Zsh
La documentación de Zsh proporciona indicaciones similares sobre estas notificaciones, consulte la
man 1 zshmisc
sección "TRABAJOS". Estas notificaciones no se muestran cuando el control de trabajo está desactivado.Golpetazo
Parece que Bash siempre muestra, por ejemplo
[1] 25647
. La "notificación final", por ejemplo,[1]+ Done true
no se muestra cuando el control de trabajo está desactivado.Control de trabajo deshabilitado
Conclusión
No sé si deshabilitar el control del trabajo para ocultar las notificaciones es algo bueno.
Recursos
man 1 zshmisc
, sección TRABAJOS.man 1 zshoptions
.fuente
Puede invocar
zsh
como un shell no interactivo para deshabilitar las notificaciones de trabajo.fuente
Vea el siguiente ejemplo:
Eso funciona bien No es necesario
( )
: eso hace una subshell no necesaria.{ }
son solo comandos de agrupación.fuente
[2] 49591
y[2] + 49591 exit 1 find /usr
, cuando no debería imprimir ninguno de estos!Esta es una vieja pregunta, pero una posible respuesta (en bash, no probada con zsh) es usar el control de trabajo en la subshell:
(command & wait)
Nota: bash suprime los mensajes de trabajo de fondo de inicio / finalización en la subshell, y no hay necesidad de redireccionar.
fuente
(sleep 5 & wait)
demora 5 segundos.