С помощью set -e завершается состояние следующей команды! теряется в блоке if - PullRequest
0 голосов
/ 29 мая 2020
set -e
if ! some_command; then
  RET=$?
  if [[ $RET == 255 ]]; then
    ...do something handling...
  fi
fi

угадайте, что случилось? RET всегда будет 0, независимо от того, что some_command возвращает ненулевое значение.

Это намеренно? Я не могу в это поверить.

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Как сказал огуз исмаил, это результат ! - поскольку он преобразует статус отказа в успех, и есть только один возможный статус успеха (ноль), он обязательно теряет указанный код c отказа. Но вы можете сделать эквивалент этого без использования !:

set -e
some_command || {
  RET=$?
  if [[ $RET == 255 ]]; then
    ...do something handling...
  fi
}

В отличие от решения PIPESTATUS, это переносимо на оболочки, отличные от bash (оно должно работать с любой оболочкой POSIX). (Хотя, как указал огуз исмаил, условное выражение [[ ]] не переносимо - переносимая версия будет if [ "$RET" = 255 ]; then.)

2 голосов
/ 29 мая 2020

Да, это по замыслу (и не имеет ничего общего с set -e); ! отменяет статус выхода конвейера, которому он предшествует. Однако статусы выхода компонентов конвейера можно найти в переменной PIPESTATUS, например:

set -e
if ! some_command; then
  ret=$PIPESTATUS
  # do something with ret ...
fi

Подтверждение концепции:

$ ! (exit 42)
$ echo $?,$PIPESTATUS
0,42
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...