8

Команда ниже выводит "0" или "1" правильно, в зависимости от ошибки или нет, потому что я положил $? внутри команды "су".

sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"

Однако, если я сделаю это:

sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?

он всегда будет печатать "0", потому что фактическое "su" всегда будет успешным, даже если часть команды завершится неудачно.

Любая идея, как я могу получить код выхода подоболочки?

4 ответа4

7

Я просто исправил почти точно такую же ситуацию. Надеюсь, что это все еще поможет вам, если не тогда, возможно, другие. Я начал с su, а не с sudo, но поскольку sudo предназначен для переноса еще одной команды, он действительно должен передавать код выхода su. Если нет, вы можете применить исправление ниже на уровне sudo также.

Как вы заметили, главная проблема в том, что команда успешно выполняет свою команду. Действие по умолчанию - сообщить о том, что оно выполнено без проблем, и возвращает код завершения 0. Он не "знает", что код выхода из команды, отличный от 0, был неожиданным или что он должен что-то с этим сделать. Таким образом, решение состоит в том, чтобы заставить su вернуть код завершения своей последней команды. Это сделало это для меня

su <user_x> -c '<bunch_of_commands>; exit $?'

В случае, если sudo не играет хорошо, вся команда должна выглядеть примерно так (я бы проверил это для вас, но у меня не установлено sudo)

sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'

Следите за вложением цитат и убедитесь, что $? не раскрывается, поэтому двойных кавычек нет.

2

Выведите возвращаемое значение внутри команды и получите доступ к нему снаружи, назначив целую команду переменной (используя подоболочку.)

RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL
0

Вы всегда можете использовать файл tmp:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code
0

Это работает в оболочках Zsh/Bash/Bourne:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"
$ echo $?

Я не уверен, почему код возврата недоступен, когда вы запрашиваете его в одной строке, но он доступен, когда вы используете более одной строки, чтобы сделать то же самое.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .