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

8

Rodando

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

resulta em test1 sendo impresso para o console e echo $? para imprimir 1 , o que, no meu entendimento, está correto, porque o comando deve retornar com o que o [b/d]ash -c interno retornou, enquanto

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 0 de acordo com echo $? .

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

Estou usando bash 4.4.12 e dash 0.5.8-2.3ubuntu1 no Ubuntu 17.10 (Artful Aardvark).

    
por Karl Richter 18.11.2017 / 20:04

1 resposta

20

&> não está no POSIX e não é suportado por dash . É analisado como & > , então o comando é em segundo plano. Os comandos em segundo plano recebem um status de saída zero da perspectiva do pai, já que não saiu quando você leu $ ?.

É também por isso que (pelo menos para mim) a saída " test1 " aparece no meu prompt, após o comando terminou.

O &> foo do Bash é equivalente a > foo 2>&1 e um script portátil deve usar o último.

    
por 18.11.2017 / 20:19