Eu quero como uma cadeia de comando em segundo plano cp a b && mv b c && rm a
.
Eu tentei fazer cp a b && mv b c && rm a &
isso, mas isso só dá suporte ao último processo.
Como eu ensino uma cadeia de comandos em segundo plano?
Eu quero como uma cadeia de comando em segundo plano cp a b && mv b c && rm a
.
Eu tentei fazer cp a b && mv b c && rm a &
isso, mas isso só dá suporte ao último processo.
Como eu ensino uma cadeia de comandos em segundo plano?
Respostas:
cp a b && mv b c && rm a &
está correto. &
tem precedência mais baixa que &&
. De fato, &
tem precedência mais baixa do que qualquer outra coisa que não seja ;
newline: &
está na mesma categoria sintática que ;
, a diferença é que ;
executa a lista de comandos em primeiro plano e &
em segundo plano. Você pode testar isso por si mesmo:
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
Mesmo com pdksh, ksh93, bash, csh, tcsh.
A exceção é o zsh, que é estranhamente incompatível. Isso está documentado no manual :
Se uma sublista é terminada por um
&
,&|
ou&!
, o shell executa o último gasoduto nele no fundo, e não esperar que ela termine (note a diferença de outras conchas que executam toda a sub-lista em segundo plano).
Infelizmente, o zsh se comporta dessa maneira, mesmo no modo de compatibilidade sh ou ksh. Para garantir que o comando inteiro seja executado em segundo plano, coloque chaves ou parênteses em torno dele. Parênteses criam um subshell enquanto chaves não, mas isso é irrelevante (exceto como uma micro otimização em alguns shells), pois um comando em segundo plano está em um subshell de qualquer maneira.
{ cp a b && mv b c && rm a; } &
você pode colocá-lo entre parênteses como (cp a b && mv b c && rm a )&
incluir toda a cadeia.
{ ... ; }
é uma forma preferível (caminho).
{ ... ; } &
faça um fork no nível do processo atual, enquanto o( ... ) &
fork de um subshell ... O resultado é o mesmo, mas de qualquer maneira há uma diferença sutil.