¿Cómo se pueden ejecutar múltiples programas en segundo plano con un solo comando?

36

¿Cómo se pueden ejecutar múltiples programas en segundo plano con un solo comando?

He probado los siguientes comandos, pero no funcionan.

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'
Rahul Patil
fuente
¿Qué es un solo "comando"? ¿Una línea de bash?
Oluf Lorenzen
1
stackoverflow.com/questions/14612371/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Puede que me falte algo obvio, pero && implica conocer el código de salida del comando anterior. Si lo pone en segundo plano, no se conocerá el código de salida. ¿Cuál era la necesidad funcional allí?
Richlv

Respuestas:

32

Desde el punto de vista de la sintaxis de shell, &separa comandos como ;/ |/ &&... (aunque, por supuesto, con una semántica diferente). Entonces es solo:

cmd1 & cmd2 & cmd3 &
Stéphane Chazelas
fuente
1
esto no es / bastante / correcto, ;comienza el siguiente comando tan pronto como termina el primero. &en realidad pone el comando en segundo plano. solo intenta esto:echo foo & echo bar & echo test &
Oluf Lorenzen
1
@Finkregh, por supuesto. Nadie lo duda. Simplemente quise decir que ambos comandos separados (desde el punto de vista de la sintaxis) sin implicaciones sobre cómo se ejecutan.
Stéphane Chazelas
No es exactamente lo que se pidió, ya que la pregunta especificaba la emisión de un "comando único". Tampoco es mi respuesta, ya que también es una serie de comandos, pero tiene al menos un semántico de un solo comando en que la salida se concatena, se puede redirigir, etc.
Eli Heady
Sin embargo, "múltiples comandos con un solo comando" parece ser un oxímoron. ¿Qué significa eso? Si esto es para algo sudoasí, podría ingresar la contraseña solo una vez, envolverla en bash -co similar.
Richlv
12

La sección de la página de manual de bash titulada Compound Commands tiene dos opciones que funcionarían, enumerar y agrupar comandos.

Un comando de grupo es una serie de comandos encerrados entre llaves {}. Una lista es la misma, encerrada entre paréntesis (). Ambos se pueden usar para poner en segundo plano múltiples comandos dentro y finalmente para poner en segundo plano toda la colección como un conjunto. La construcción de la lista ejecuta comandos en una subshell, por lo que las asignaciones de variables no se conservan.

Para ejecutar un grupo de comandos:

{ command1 & command2 & } &

También puede ejecutar sus comandos en una lista (subshell):

( command1 & command2 ) &
Eli Heady
fuente
1
De nada. Agregué el enlace al manual. Tenga en cuenta que la ()sintaxis de la lista ejecuta los comandos incluidos en una subshell, por lo que las variables no se conservan dentro.
Eli Heady
3

de otra manera:

$(command1 &) && command2 & 
Golfo pérsico
fuente
No, ejecutará el primer comando y luego, después de terminar primero, ejecutará otro comando
Rahul Patil el
que usó &&en su pregunta, significa que primero debe ejecutar un comando y luego, si se ejecuta con éxito, ejecute el siguiente comando. Si no lo considera, puede ejecutarcommand1 & ; command2 & ;
PersianGulf
primer comando se ejecuta correctamente en bg, o se ejecuta ;sin problemas con eso
Rahul Patil