Bash: поток сообщений об ошибках внезапно меняет значение с 1 на 0 - PullRequest
0 голосов
/ 27 июня 2018

Я пишу некоторый код для класса по сообщениям об ошибках, и я столкнулся со странной проблемой, которую мой учитель не мог понять. Это выглядит примерно так.

function errorCheck(){
if ! firstError $*
then 
return $?
elif ! secondError $*
then
return $?
fi

, где firstError и secondError - это другие функции, которые проверяют наличие определенных ошибок. Возвращаемое значение затем подается в другую функцию, которая просто выводит текст ошибки. Те работают хорошо, я взял их с другой работы, которую я написал, и они работают. Тем не менее, когда я бегу

bash -x myFunction bad parameters

показывает, что firstError успешно возвращает код ошибки 1, как и положено, но затем внезапно переключается на возврат 0. Вот так:

+ errorCheck bad parameters
+ firstError bad parameters
+ return 1
+ return 0
+ main bad parameters

Однако, когда я жестко закодировал это так:

function errorCheck(){
if ! firstError $*
then 
return 1
elif ! secondError $*
then
return 2
fi

Тогда отчет bash выглядит так:

+ errorCheck bad parameters
+ firstError bad parameters
+ return 1
+ return 1
+ errorReport 1
+ echo 'Error 1'
+ exit 1

Что я хочу, чтобы произошло. Почему возвращаемое значение внезапно переключается на 0? Пожалуйста, будьте проще, поскольку я новичок в bash.

1 Ответ

0 голосов
/ 27 июня 2018

Оператор ! инвертирует статус выхода команды. Если команда firstError возвращает ненулевой статус, статус выхода ! firstError равен 0, и наоборот. $? содержит это состояние инвертированного выхода.

Если вы хотите сохранить исходное состояние выхода, поместите if отдельно от запуска команды и поместите его в переменную.

firstError $*
status=$?
if [ $status -ne 0 ]
then
    return $status
fi
secondError $*
status=$?
if [ $status -ne 0 ]
    return $status
fi

Другая возможность заключается в использовании оператора ||:

firstError $* || return
secondError $* || return

Если return не задан аргумент, по умолчанию используется $?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...