Ejecutando el comando de shell en el fondo del script

¿cómo puedo ejecutar un comando de shell en el fondo desde un script bash, si el comando está en una cadena?

Por ejemplo:

#!/bin/bash cmd="nohup mycommand"; other_cmd="nohup othercommand"; "$cmd &"; "$othercmd &"; 

esto no funciona, ¿cómo puedo hacer esto?

Deja de cotizaciones

 $cmd & $othercmd & 

p.ej:

 nicholas@nick-win7 /tmp $ cat test #!/bin/bash cmd="ls -la" $cmd & nicholas@nick-win7 /tmp $ ./test nicholas@nick-win7 /tmp $ total 6 drwxrwxrwt+ 1 nicholas root 0 2010-09-10 20:44 . drwxr-xr-x+ 1 nicholas root 4096 2010-09-10 14:40 .. -rwxrwxrwx 1 nicholas None 35 2010-09-10 20:44 test -rwxr-xr-x 1 nicholas None 41 2010-09-10 20:43 test~ 

Partiendo de la ngoozeff de ngoozeff , si desea hacer que un comando se ejecute completamente en segundo plano (es decir, si desea ocultar su resultado y evitar que se mate al cerrar su ventana de terminal), puede hacer esto en su lugar:

 cmd="google-chrome"; "${cmd}" &>/dev/null &disown; 

& (el primero) separa el comando de stdin .
>/dev/null separa la sesión del shell de stdout y stderr .
&disown elimina el comando de la lista de trabajos del shell .

¡También puedes usar &! en lugar de &disown ; ambos son el mismo comando.

Además, al poner un comando dentro de una variable, es más apropiado usar eval "${cmd}" lugar de "${cmd}" :

 cmd="google-chrome"; eval "${cmd}" &>/dev/null &disown; 

Si ejecuta este comando directamente en Terminal , mostrará el PID del proceso que inicia el comando. Pero dentro de un script de shell , no se mostrará ninguna salida .

Aquí hay una función para esto:

 #!/bin/bash # Run a command in the background. _evalBg() { eval "$@" &>/dev/null &disown; } cmd="google-chrome"; _evalBg "${cmd}"; 

http://felixmilea.com/2014/12/running-bash-commands-background-properly/

Esto funciona porque es una variable estática. Podrías hacer algo mucho más genial como este:

 filename="filename" extension="txt" for i in {1..20}; do eval "filename${i}=${filename}${i}.${extension}" touch filename${i} echo "this rox" > filename${i} done 

Este código creará 20 archivos y establecerá dinámicamente 20 variables. Por supuesto, podrías usar una matriz, pero solo te estoy mostrando la característica :). Tenga en cuenta que puede usar las variables $ filename1, $ filename2, $ filename3 … porque se crearon con el comando de evaluación. En este caso, solo estoy creando archivos, pero podría usarlos para crear dinámicamente argumentos para los comandos y luego ejecutarlos en segundo plano.

Por ejemplo, tiene un progtwig de inicio llamado run.sh para comenzar a trabajar en segundo plano, haga la siguiente línea de comando. ./run.sh y> / dev / null &