Состояние выхода Команды в 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 Вывод данных о состоянии канала и захвата в Bash

Завершите команду, которую я пытался.

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

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 Механизмы поддержки, а не как баш вопрос.

Другие вопросы по тегам