Статус выхода команды в Bash Scripting всегда верен

Я пытаюсь запустить команду (запрос gerrit) в bash и назначить ее переменной. Я использую это файл сценария bash, и я хочу обработать случай, когда, если команда выдает ошибку (т. Е. Если запрос gerrit завершается неудачно), я должен иметь возможность обрабатывать то же самое.

Например:

var=`ssh -p $GERRIT_PORT_NUMBER $GERRIT_SERVER_NAME gerrit query --current-patch-set $PATCHSET_ID`

Я знаю, что могу проверить последний статус выхода, используя $? в bash, но для приведенного выше случая назначение переменной переопределяет более ранний статус выхода (т. е. статус ошибки запроса gerrit), и приведенная выше команда никогда не завершается ошибкой. Это всегда так.

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

Обновление:
Мое предположение было неверным здесь, что назначение вызывало переопределение статуса выхода, и пример Чарльза и объяснение в его ответе верны. Настоящая причина переопределения статуса выхода заключалась в том, что я передал вывод вышеуказанной команды в сценарий sed, который был виновником переопределения статуса выхода. Я нашел следующее, что помогло мне решить проблему. https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/73180#73180 Вывод канала и статус выхода в Bash

Полная команда, которую я пытался.

вар=ssh -p $GERRIT_PORT_NUMBER $GERRIT_SERVER_NAME gerrit query --current-patch-set $PATCHSET_ID | sed 's/message//'


person Jose    schedule 08.10.2014    source источник
comment
Можете ли вы предоставить средство воспроизведения этой ошибки, которое не включает gerrit (например, запуск /bin/false или sh -c "exit 3")?   -  person Charles Duffy    schedule 09.10.2014
comment
Что именно вы подразумеваете под ошибкой запроса Gerrit? Что запрос возвращает нулевые результаты или что есть синтаксическая проблема с запросом или внутренняя ошибка сервера? Я бы сказал, что первый случай не является ошибкой.   -  person Magnus Bäck    schedule 09.10.2014
comment
Привет, Магнус! Ошибка запроса gerrit (сбой запроса Gerrit) может быть вызвана любой проблемой, например невозможностью связаться с GERRIT_SERVER, может быть внутренней ошибкой сервера или даже неправильным GERRIT_PORT или GERRIT_SERVER_NAME или недопустимым или несуществующим PATCHSET_ID. .   -  person Jose    schedule 10.10.2014


Ответы (1)


Утверждение, сделанное в этом вопросе, неверно; назначения не изменяют статус выхода. Вы можете проверить это самостоятельно:

var=$(false); echo $?

...будет правильно испускать 1.


Тем не менее, если присваивание выполняется в контексте local, declare или аналогичного ключевого слова, это может больше не выполняться:

f() { local var=$(false); echo $?; }; f

... будет испускать 0, и это можно обойти, отделив local от присваивания:

f() { local var; var=$(false); echo $?; }; f

... который правильно возвращает 1.


Сам SSH также правильно возвращает статус выхода, так как вы можете проверить себя аналогичным образом:

ssh localhost false; echo $?

... правильно возвращает 1.


Разумный вывод, таким образом, состоит в том, что gerrit сам по себе не может передать неуспешный статус выхода. Эта ошибка должна быть устранена через механизмы поддержки gerrit, а не как вопрос bash.

person Charles Duffy    schedule 08.10.2014