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?
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?
Respuestas:
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; } &
puedes ponerlo en paréntesis (cp a b && mv b c && rm a )&
para incluir toda la cadena.
{ ... ; }
es una forma preferible (forma).
{ ... ; } &
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.