Como background uma cadeia de comando?

15

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?

Cobra_Fast
fonte

Respostas:

22

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; } &
Gilles 'SO- parar de ser mau'
fonte
8
Sob o bash , { ... ; } &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.
26513 Hauri
14

você pode colocá-lo entre parênteses como (cp a b && mv b c && rm a )&incluir toda a cadeia.

repetição
fonte
2
E importante Isso deixa claro que toda a cadeia está em segundo plano, mesmo para alguém que pode não saber as regras de como os operadores são delimitadas
jackweirdy
2
Olhe para o meu comentário na resposta de @ Gilles, acho que { ... ; }é uma forma preferível (caminho).
26513 Hauri