Como fazer o background de uma cadeia de comandos?

14

Eu quero colocar em segundo plano uma cadeia de comando como cp a b && mv b c && rm a .

Eu tentei fazer cp a b && mv b c && rm a & , mas isso é apenas o último processo.

Como pano de fundo uma cadeia de comando?

    
por Cobra_Fast 26.08.2013 / 15:19

2 respostas

21

cp a b && mv b c && rm a & está correto. & tem precedência menor que && . De fato, & tem precedência menor do que qualquer coisa diferente de ; e nova linha: & está na mesma categoria sintática que ; , a diferença é que ; executa a lista de comandos em primeiro plano enquanto & roda 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 é zsh, que é estranhamente incompatível. Isso é documentado no manual :

If a sublist is terminated by a &, &|, or &!, the shell executes the last pipeline in it in the background, and does not wait for it to finish (note the difference from other shells which execute the whole sublist in the background).

Infelizmente, o zsh se comporta dessa maneira mesmo no modo de compatibilidade sh ou ksh. Para garantir que todo o comando seja executado em segundo plano, coloque chaves ou parênteses em torno dele. Parênteses criam um subshell enquanto que chaves não, mas isso é irrelevante (exceto como uma micro otimização em alguns shells) já que um comando em segundo plano está em uma subshell de qualquer maneira.

{ cp a b && mv b c && rm a; } &
    
por 26.08.2013 / 15:56
14

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

    
por 26.08.2013 / 15:20