Quiero saber si hay una manera de poner el ampersand en una variable y aún usarlo para enviar un proceso a un segundo plano.
Esto funciona:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
¿Pero no sería genial lograr esas cinco líneas con una sola? Al igual que:
BCKGRND='&'
sleep 5 ${BCKGRND}
Pero eso no funciona. Si BCKGRND no está configurado, funciona, pero cuando está configurado, se interpreta como un '&' literal y elimina los errores.
bash
shell-script
variable
background-process
BrowncoatOkie
fuente
fuente
echo $!
devuelve el PIDRespuestas:
No es posible usar una variable para poner en segundo plano la llamada porque la expansión de la variable ocurre después de que la línea de comandos se analiza para los operadores de control (como
&&
y&
).Otra opción sería envolver las llamadas en una función:
... y luego establezca la variable según sea necesario:
fuente
ed
? +1 de todos modos, esta es la solución más limpia.Puede voltear cosas y variabilizar el "primer plano":
Establecer
FOREGROUND
atrue
o vaciar para ejecutar el proceso en segundo plano. (¡La configuraciónFOREGROUND
paratrue
ejecutarse en segundo plano es ciertamente confusa! Los nombres de variables apropiados se dejan como ejercicio para el lector).fuente
set -m
se haya utilizado).Probablemente deberías usar
eval
:eval
hace que el shell vuelva a evaluar los argumentos dados.&
Por lo tanto, un literal se interpretaría como&
al final de un comando y no como un argumento para el comando, poniendo el comando en segundo plano.fuente
eval
debe contener una advertencia, que debe manejarse con cuidado. Ver, por ejemplo, esta respuesta ."$BCKGRND"
evaluar un argumento vacío.eval
unirá sus argumentos con espacios antes de realizar la evaluación real. Haga la prueba:eval printf "'{%s}\n'" foo "" "" ""
.eval foo "" "" "" ""
es completamente similar aeval foo
, no importa quéIFS
u otra cosa sea.eval 'sleep $TIMEOUT' "$BACKGROUND"
. De lo contrario, podría obtener expansiones dobles si la variable se expande a otra variable o contiene caracteres especiales. Además, las citas anidadas pueden ser complicadas.