Почему выход с сохраненным кодом возврата вложенной команды приводит к различным кодам возврата в Dash и Bash?

8

Бег

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

в результате test1выводится на консоль и echo $?печатается, 1что, на мой взгляд, правильно, потому что команда должна возвращать то, что [b/d]ash -cвернул внутренний, тогда как

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

приводит к тому же выводу, но возвращается с 0согласно echo $?.

Я хотел бы понять эту разницу, чтобы расширить мое понимание оболочек и программирования переносимых оболочек.

Я использую bash4.4.12 и dash0.5.8-2.3ubuntu1 на Ubuntu 17.10 (хитрый Aardvark).

Карл Рихтер
источник

Ответы:

20

&>не в POSIX и не поддерживается dash. Он анализируется как & >, поэтому команда является фоновой вместо. Основным командам присваивается нулевой статус выхода с точки зрения родителя, поскольку они не вышли к моменту чтения $ ?.

Вот почему (по крайней мере для меня) test1вывод " " появляется в моей подсказке после завершения команды.

Bash &> fooэквивалентен> foo 2>&1 , и переносимый скрипт должен использовать последний.

Майкл Гомер
источник
5
&>находится в POSIX. Вот &следует >. Во- foo &> barпервых, это foo &запуск fooв фоновом режиме и > barперенаправление без команды. bashне соответствует POSIX, когда интерпретирует его по-другому.
Стефан
4
Достаточно интересно, что это не было упомянуто в wiki.ubuntu.com/DashAsBinSh. Я позволил себе отредактировать страницу и добавить ее
Сергей Колодяжный,