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