¿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 &