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