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

5746
Nick

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

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

8

4 ответа на вопрос

7
Captain Coder

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

Echo the return value inside the command and access it outside by assigning the whole command to a variable (using a subshell.)

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

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

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code 
Да, это то, чем я сейчас занимаюсь, но я надеялся не полагаться на файл tmp. Nick 12 лет назад 0
0
zero2cx

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

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

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

This is actually not correct. This will always return zero because the "su -m $USER -c " will always succeed even if the actual command within it doesn't. Nick 12 лет назад 0
@Nick -- It works here. What's your output? Try `sudo su -m zero2cx -c "/bin/false &> /dev/null"` but with your system username. `$?` should be '1'. zero2cx 12 лет назад 1
Yup, with my own username it returns "1" as expected. But I'm trying to use this to run an app via its own user and not root or any other user. Nick 12 лет назад 0
@Nick - он должен работать с $ USER = appusername, установленным, как вы хотите. Не используйте реальное имя пользователя, непрочитайте, используйте ваше предполагаемое имя пользователя. Это должно работать, это для меня. zero2cx 12 лет назад 0

Похожие вопросы