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


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» всегда будет успешным, даже если часть команды завершится неудачно.

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

Ответы:


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

Да, это то, чем я сейчас занимаюсь, но я надеялся не полагаться на файл tmp.
Ник

0

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

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

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


Это на самом деле не правильно. Это всегда будет возвращать ноль, потому что «su -m $ USER -c <cmd>» всегда будет успешным, даже если действительная команда внутри него этого не сделает.
Ник

1
@ Ник - это работает здесь. Какой у тебя выход? Попробуйте, sudo su -m zero2cx -c "/bin/false &> /dev/null"но с вашим системным именем пользователя. $?должно быть «1».
zero2cx

Да, с моим собственным именем пользователя возвращает «1», как и ожидалось. Но я пытаюсь использовать это для запуска приложения от своего собственного пользователя, а не от пользователя root или любого другого пользователя.
Ник

@ Ник - Он должен работать с $ USER=appusernameсетом, как вы хотите. Не используйте реальное имя пользователя, непрочитайте, используйте свое предназначение appusername. Это должно работать, это для меня.
zero2cx
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.