Я просто виправив майже таку саму ситуацію. Сподіваюся, це все-таки допоможе вам, якщо не, можливо, іншим. Я почав з su, а не з sudo, але оскільки судо призначений для завершення однієї іншої команди, йому дійсно слід передати код виходу su. Якщо ні, ви також можете застосувати виправлення нижче на рівні судо.
Як ви зазначили, головна проблема полягає в тому, що Su успішно виконує свою команду. Дія за замовчуванням полягає в тому, щоб повідомити про те, що він виконаний без проблем, і тому він повертає код виходу 0. Він не "знає", що код виходу не 0 з команди був несподіваним, або що він повинен щось робити з нею. Таким чином, рішення досить просто змусити повернути вихідний код останньої команди. Це зробило це для мене
su <user_x> -c '<bunch_of_commands>; exit $?'
У випадку, якщо sudo не грає добре, вся команда повинна бути приблизно такою (я би перевірив це для вас, але у мене не встановлено sudo)
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
Слідкуйте за вкладенням котирувань і переконайтеся, що $? не розширюється, тому немає подвійних лапок.