Bash не возвращает переменную $? правильно, когда вывод команды присваивается локальной переменной:
test() {
aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 124 (!=0 as expected)
local aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 0
}
Почему?
решение1
local
является командой сама по себе (это встроенная команда оболочки), поэтому вы получаете возвращаемое значение local
, а не возвращаемое значение конвейера в вашей подстановке команды. Вы можете рассмотреть возможность объявления переменной local до назначения, что позволит избежать необходимости вызывать local
встроенную команду в том же конвейере, что и подстановка команды, что позволит избежать сокрытия кода выхода вашей команды:
foo() {
local bar
bar=$(baz)
echo $?
}