¿Cómo hacer un fondo de una cadena de comando?

15

Quiero poner en segundo plano una cadena de comandos como cp a b && mv b c && rm a.

He intentado hacerlo, cp a b && mv b c && rm a &pero esto solo da origen al último proceso.

¿Cómo hago un fondo de una cadena de comandos?

Cobra_Fast
fuente

Respuestas:

22

cp a b && mv b c && rm a &es correcto. &tiene menor prioridad que &&. De hecho, &tiene una prioridad más baja que cualquier otra cosa que no sea ;newline: &está en la misma categoría sintáctica que ;, la diferencia es que ;ejecuta la lista de comandos en primer plano mientras que la &ejecuta en segundo plano. Puedes probar esto por ti mismo:

$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited

Lo mismo con pdksh, ksh93, bash, csh, tcsh.

La excepción es zsh, que es extrañamente incompatible. Esto está documentado en el manual :

Si una sublista se termina por una &, &|o &!, el shell ejecuta la última tubería en ella, en el fondo, y no espera a que termine (tenga en cuenta la diferencia de otros proyectiles que ejecutan toda la lista secundaria en el fondo).

Desafortunadamente, zsh se comporta de esta manera incluso en modo de compatibilidad sh o ksh. Para asegurarse de que todo el comando se ejecute en segundo plano, coloque llaves o paréntesis a su alrededor. Los paréntesis crean un subshell mientras que los corchetes no, pero esto es irrelevante (excepto como una microoptimización en algunos shells) ya que un comando de fondo está en un subshell de todos modos.

{ cp a b && mv b c && rm a; } &
Gilles 'SO- deja de ser malvado'
fuente
8
En bash , { ... ; } &haga una bifurcación en el nivel de proceso actual, mientras ( ... ) &que bifurca desde una subshell ... El resultado es el mismo, pero de todos modos hay una sutil diferencia.
F. Hauri
14

puedes ponerlo en paréntesis (cp a b && mv b c && rm a )&para incluir toda la cadena.

repetición
fuente
2
Y lo que es más importante, esto deja en claro que toda la cadena está en segundo plano, incluso para alguien que tal vez no conozca las reglas de cómo están limitados los operadores
jackweirdy
2
Mire mi comentario a la respuesta de @ Gilles, creo que { ... ; }es una forma preferible (forma).
F. Hauri