Voglio mettere in background una catena di comando come cp a b && mv b c && rm a
.
Ho provato a farlo cp a b && mv b c && rm a &
ma questo fa da sfondo all'ultimo processo.
Come faccio a mettere in background una catena di comandi?
Voglio mettere in background una catena di comando come cp a b && mv b c && rm a
.
Ho provato a farlo cp a b && mv b c && rm a &
ma questo fa da sfondo all'ultimo processo.
Come faccio a mettere in background una catena di comandi?
Risposte:
cp a b && mv b c && rm a &
è corretta. &
ha una precedenza inferiore a &&
. In effetti &
ha una precedenza inferiore rispetto a qualsiasi altra cosa ;
e newline: &
è nella stessa categoria sintattica di ;
, la differenza è che ;
esegue l'elenco dei comandi in primo piano mentre lo &
esegue in background. Puoi testarlo tu stesso:
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
Lo stesso vale per pdksh, ksh93, bash, csh, tcsh.
L'eccezione è zsh, che è stranamente incompatibile. Questo è documentato nel manuale :
Se un elenco secondario termina con un
&
,&|
o&!
, la shell esegue l'ultimo pipeline in in background, e non aspetta che finisca (si noti la differenza con altre shell che eseguono l'intero sottolista in background).
Sfortunatamente, zsh si comporta in questo modo anche in modalità di compatibilità sh o ksh. Per assicurarsi che l'intero comando venga eseguito in background, metti tra parentesi graffe o parentesi. Le parentesi creano una subshell mentre le parentesi graffe no, ma questo è irrilevante (tranne che come micro-ottimizzazione in alcune shell) poiché un comando in background è comunque in una subshell.
{ cp a b && mv b c && rm a; } &
puoi metterlo in parentesi come (cp a b && mv b c && rm a )&
per includere l'intera catena.
{ ... ; }
sia una forma preferibile (via).
{ ... ; } &
un fork all'attuale livello di processo, mentre esegui( ... ) &
un fork da una subshell ... Il risultato è lo stesso, ma c'è comunque una leggera differenza.