Доступ к коду выхода вне su -m $ USER -c "<cmd>"

Команда ниже выводит "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 ответа

Я просто исправил почти точно такую ​​же ситуацию. Надеюсь, это все еще поможет вам, если нет, то, возможно, другие. Я начал с 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$?'

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

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

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

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

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

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

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

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

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