Tôi chỉ sửa gần như chính xác tình huống tương tự. Hy vọng nó vẫn giúp bạn, nếu không thì có lẽ người khác. Tôi đã bắt đầu từ su, không phải sudo, nhưng vì sudo dự định bọc một lệnh khác, nên nó thực sự phải chuyển tiếp mã thoát của su. Nếu không, bạn cũng có thể áp dụng bản sửa lỗi bên dưới ở cấp độ sudo.
Giống như bạn lưu ý vấn đề chính là su thành công thực thi lệnh của nó. Hành động mặc định sau đó là báo cáo rằng nó đã hoàn thành mà không gặp vấn đề gì và do đó, nó trả về mã thoát 0. Nó không "biết" rằng mã thoát không 0 từ một lệnh là bất ngờ, hoặc nó nên làm gì đó với nó. Do đó, giải pháp khá đơn giản là làm cho su trả về mã thoát của lệnh cuối cùng. Điều này đã làm cho tôi
su <user_x> -c '<bunch_of_commands>; exit $?'
Trong trường hợp sudo không chơi tốt, toàn bộ lệnh sẽ giống như thế này (tôi sẽ kiểm tra điều này cho bạn nhưng tôi chưa cài đặt sudo)
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
Theo dõi các dấu ngoặc kép và đảm bảo $? không được mở rộng, vì vậy không có dấu ngoặc kép.