Pourquoi la sortie avec un code de retour stocké d'une commande imbriquée entraîne-t-elle différents codes de retour dans Dash et Bash?


8

Fonctionnement

bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

entraîne l' test1impression sur la console et l' echo $?impression, 1ce qui, à mon sens, est correct, car la commande doit retourner avec ce que l'intérieur a [b/d]ash -crenvoyé alors que

dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

donne la même sortie, mais renvoie avec 0selon echo $?.

J'aimerais comprendre cette différence afin d'élargir ma compréhension des shells et de la programmation de shell portable.

J'utilise bash4.4.12 et dash0.5.8-2.3ubuntu1 sur Ubuntu 17.10 (Artful Aardvark).

Réponses:


20

&>n'est pas dans POSIX et n'est pas pris en charge par dash. Il est analysé comme & >, donc la commande est mise en arrière-plan à la place. Les commandes en arrière-plan reçoivent un état de sortie de zéro du point de vue du parent, car elles ne sont pas sorties au moment où vous lisez $ ?.

C'est aussi pourquoi (pour moi du moins) la test1sortie " " apparaît dans mon invite, une fois la commande terminée.

Bash &> fooest équivalent à> foo 2>&1 , et un script portable devrait utiliser ce dernier.


5
&>est en POSIX. Cela est &suivi de >. Dans foo &> bar, c'est foo &pour démarrer fooen arrière-plan et > barpour effectuer une redirection sans commande. bashn'est pas conforme à POSIX lorsqu'il l'interprète différemment.
Stéphane Chazelas

4
Assez intéressant, c'est que cela n'a pas été mentionné dans wiki.ubuntu.com/DashAsBinSh J'ai pris la liberté de modifier la page et de l'inclure
Sergiy Kolodyazhnyy
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.