Comment mettre en arrière-plan une chaîne de commande?

15

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?

Cobra_Fast
la source

Réponses:

22

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; } &
Gilles 'SO- arrête d'être méchant'
la source
8
Dernder bash , { ... ; } &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.
F.Hauri
14

vous pouvez le mettre entre parenthèses comme (cp a b && mv b c && rm a )&pour inclure toute la chaîne.

rejouer
la source
2
Et surtout, cela montre clairement que toute la chaîne est en arrière-plan, même pour quelqu'un qui pourrait ne pas connaître les règles de délimitation des opérateurs
jackweirdy
2
Regardez mon commentaire sur la réponse de @ Gilles, je pense que { ... ; }c'est une forme préférable.
F.Hauri