Я просто исправил почти точно такую же ситуацию. Надеюсь, это все еще поможет вам, если нет, то, возможно, другие. Я начал с 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$?'
Следите за вложением цитат и убедитесь, что $? не раскрывается, поэтому двойных кавычек нет.
Это работает в оболочках Zsh / Bash / Bourne:
Я не уверен, почему код возврата недоступен, когда вы запрашиваете его в одной строке, но он доступен, когда вы используете более одной строки, чтобы сделать то же самое.
источник
sudo su -m zero2cx -c "/bin/false &> /dev/null"
но с вашим системным именем пользователя.$?
должно быть «1».$ USER=appusername
сетом, как вы хотите. Не используйте реальное имя пользователя, непрочитайте, используйте свое предназначениеappusername
. Это должно работать, это для меня.