La función regresa, pero la sustitución del comando se bloquea, porque creó un trabajo en segundo plano, pero aún tiene su stdout fd abierta. Solo ciérrelo agregando >/dev/null
antes de &
.
#!/bin/bash
function start {
leafpad >/dev/null &
echo $!
}
PID=$(start)
echo "PID is $PID"
Si desea que su proceso también tenga stdin, stdout, stderr cerrados, use esto:
leafpad >/dev/null 0>&1 2>&1 &
Esto cerrará stdin (0), stdout (1) y stderr (2), luego el fondo (&). Además, cuando use estas redirecciones de flujo , no olvide que están "engañadas", lo que significa que están duplicadas en el orden de ejecución.
1>/dev/null 2>&1
y
2>&1 1>/dev/null
no son lo mismo ! En el primero, está duplicando una secuencia a / dev / null (que es lo que desea), en el segundo, está duplicando / dev / stdout a stderr, y luego, cerrando stdout. Por lo tanto, cualquier mensaje enviado a stderr
aparecerá en su consola.