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).

Karl Richter
la source

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.

Michael Homer
la source
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