Доступ к коду выхода вне 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
terdon
источник
Да, это то, чем я сейчас занимаюсь, но я надеялся не полагаться на файл tmp.
Ник
0

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

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

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

zero2cx
источник
Это на самом деле не правильно. Это всегда будет возвращать ноль, потому что «su -m $ USER -c <cmd>» всегда будет успешным, даже если действительная команда внутри него этого не сделает.
Ник
1
@ Ник - это работает здесь. Какой у тебя выход? Попробуйте, sudo su -m zero2cx -c "/bin/false &> /dev/null"но с вашим системным именем пользователя. $?должно быть «1».
zero2cx
Да, с моим собственным именем пользователя возвращает «1», как и ожидалось. Но я пытаюсь использовать это для запуска приложения от своего собственного пользователя, а не от пользователя root или любого другого пользователя.
Ник
@ Ник - Он должен работать с $ USER=appusernameсетом, как вы хотите. Не используйте реальное имя пользователя, непрочитайте, используйте свое предназначение appusername. Это должно работать, это для меня.
zero2cx