Por que sair com um código de retorno armazenado de um comando aninhado resulta em códigos de retorno diferentes no Dash e no Bash?


8

Corrida

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

resulta em test1ser impresso no console e echo $?imprimir o 1que, no meu entender, está correto, porque o comando deve retornar com o que o interno [b/d]ash -cretornou

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

resulta na mesma saída, mas retorna com de 0acordo com echo $?.

Eu gostaria de entender essa diferença para ampliar meu entendimento sobre shells e programação de shell portátil.

Estou usando bash4.4.12 e dash0.5.8-2.3ubuntu1 no Ubuntu 17.10 (Artful Aardvark).

Respostas:


20

&>não está no POSIX e não é suportado por dash. Ele é analisado como & >, portanto, o comando fica em segundo plano. Os comandos em segundo plano recebem um status de saída zero da perspectiva do pai, pois eles não saem quando você lê $ ?.

É também por isso que (pelo menos para mim) a test1saída " " aparece no meu prompt, depois que o comando foi concluído.

O Bash &> fooé equivalente a> foo 2>&1 , e um script portátil deve usá-lo.


5
&>está no POSIX. Isso é &seguido por >. Em foo &> bar, é foo &para começar fooem segundo plano e > barexecutar um redirecionamento sem um comando. bashnão é compatível com POSIX quando está interpretando de maneira diferente.
Stéphane Chazelas

4
Interessante o suficiente é que isso não foi mencionado no wiki.ubuntu.com/DashAsBinSh Tomei a liberdade de editar a página e incluí-lo #
Sergiy Kolodyazhnyy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.