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?

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; } &

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.