Je veux créer une chaîne de commandes comme cp a b && mv b c && rm a
.
J'ai essayé de le faire, cp a b && mv b c && rm a &
mais cela ne fait que retracer le dernier processus.
Comment créer un arrière-plan d'une chaîne de commande?
Je veux créer une chaîne de commandes comme cp a b && mv b c && rm a
.
J'ai essayé de le faire, cp a b && mv b c && rm a &
mais cela ne fait que retracer le dernier processus.
Comment créer un arrière-plan d'une chaîne de commande?
Réponses:
cp a b && mv b c && rm a &
est correct. &
a une priorité inférieure à &&
. En fait, &
a une priorité inférieure à tout autre chose que ;
et newline: &
est dans la même catégorie syntaxique que ;
, la différence étant que ;
la liste de commandes est exécutée au premier plan tandis &
qu'elle est exécutée en arrière-plan. Vous pouvez tester cela par vous-même:
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
Idem avec pdksh, ksh93, bash, csh, tcsh.
L'exception est zsh, qui est étrangement incompatible. Ceci est documenté dans le manuel :
Si une sous - liste se termine par un
&
,&|
ou&!
, le shell exécute le dernier pipeline dans l'arrière - plan, et ne l' attend pas à terminer (notez la différence des autres coquilles qui exécutent toute sublist en arrière - plan).
Malheureusement, zsh se comporte de cette manière même en mode de compatibilité sh ou ksh. Pour vous assurer que la commande entière est exécutée en arrière-plan, placez des accolades ou des parenthèses autour d'elle. Les parenthèses créent un sous-shell, contrairement aux accolades, mais cela n'est pas pertinent (sauf en tant que micro-optimisation dans certains shells) car une commande en arrière-plan est de toute façon dans un sous-shell.
{ cp a b && mv b c && rm a; } &
vous pouvez le mettre entre parenthèses comme (cp a b && mv b c && rm a )&
pour inclure toute la chaîne.
{ ... ; }
c'est une forme préférable.
{ ... ; } &
faites un fork au niveau du processus en cours, tandis que( ... ) &
faites un fork à partir d'un sous-shell ... Le résultat est le même, mais il y a quand même une différence subtile.