Почему local подметает код возврата команды?

Этот фрагмент Bash работает так, как я и ожидал:

$ fun1() { x=$(false); echo "exit code: $?"; }
$ fun1
exit code: 1

Но этот, используя local, не делает:

$ fun2() { local x=$(false); echo "exit code: $?"; }
$ fun2
exit code: 0

Кто-нибудь может объяснить, почему local подметает код возврата команды?


person tokland    schedule 12.12.2010    source источник
comment
См. lists.gnu.org/archive/html/bug. -bash/2010-03/msg00007.html   -  person tokland    schedule 23.11.2016


Ответы (2)


Причина, по которой код с local возвращает 0, заключается в том, что $? «расширяется до состояния выхода самого последнего запущенного конвейера переднего плана». Таким образом, $? возвращает успех local

Вы можете исправить это поведение, отделив объявление x от инициализации x следующим образом:

$ fun() { local x; x=$(false); echo "exit code: $?"; }; fun
exit code: 1
person SiegeX    schedule 12.12.2010
comment
Для протокола: проблема обсуждается в вики BashPitfalls: mywiki.wooledge. орг/ - person tokland; 10.04.2011
comment
также описано в google-styleguide для bash: google.github.io/styleguide / - person Trevor Boyd Smith; 15.11.2018

Код возврата команды local скрывает код возврата false

person Ignacio Vazquez-Abrams    schedule 12.12.2010
comment
Да, я это понимаю, но местный, поскольку это особое ключевое слово, я не ожидаю, что оно будет затемнено. Думаю, это было ложное предположение. - person tokland; 12.12.2010
comment
Это не специальное ключевое слово, это встроенная оболочка. Даже встроенные функции имеют возвращаемые значения. - person Ignacio Vazquez-Abrams; 12.12.2010
comment
Shellcheck может обнаружить эту проблему (SC2155). - person pjh; 26.02.2016