Bash не возвращает переменную $? правильно

Bash не возвращает переменную $? правильно

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 $?
}

Связанный контент