Доступ к коду выхода за пределами su -m $USER -c ""

Доступ к коду выхода за пределами su -m $USER -c ""

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

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

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

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

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

Есть идеи, как получить код выхода подоболочки?

решение1

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

Как вы заметили, главная проблема в том, что su успешно выполняет свою команду. Действие по умолчанию — сообщить, что она завершилась без проблем, и поэтому она возвращает код выхода 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

решение3

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

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

решение4

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

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

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

Связанный контент