Я просто исправил почти точно такую же ситуацию. Надеюсь, что это все еще поможет вам, если не тогда, возможно, другие Я начал с 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$?'
Следите за вложением цитат и убедитесь, что $? не раскрывается, поэтому двойных кавычек нет.