Saya baru saja memperbaiki situasi yang hampir persis sama. Semoga masih bisa membantu Anda, jika tidak maka mungkin orang lain. Saya mulai dari su, bukan sudo, tetapi karena sudo dimaksudkan untuk membungkus satu perintah lain, itu benar-benar harus menyampaikan kode keluar su. Jika tidak, Anda dapat menerapkan perbaikan di bawah ini pada level sudo juga.
Seperti yang Anda perhatikan, masalah utamanya adalah su berhasil mengeksekusi perintahnya. Tindakan default adalah untuk melaporkan bahwa itu selesai tanpa masalah dan karenanya mengembalikan kode keluar 0. Tidak "tahu" bahwa kode keluar 0 dari suatu perintah tidak terduga, atau bahwa ia harus melakukan sesuatu dengan itu. Jadi solusinya cukup sederhana untuk membuat su mengembalikan kode keluar dari perintah terakhirnya. Ini berhasil untukku
su <user_x> -c '<bunch_of_commands>; exit $?'
Dalam hal sudo tidak bermain bagus, seluruh perintah harus seperti ini (saya akan memeriksa ini untuk Anda tetapi saya tidak menginstal sudo)
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
Perhatikan nesting kutipan dan pastikan $? tidak diperluas, jadi tidak ada tanda kutip ganda.
Ini bekerja di shell Zsh / Bash / Bourne:
Saya tidak yakin mengapa kode pengembalian tidak tersedia ketika Anda memintanya dalam satu-liner, tetapi tersedia ketika Anda menggunakan lebih dari satu baris untuk melakukan hal yang sama.
sumber
sudo su -m zero2cx -c "/bin/false &> /dev/null"
tetapi dengan nama pengguna sistem Anda.$?
harus '1'.$ USER=appusername
set yang Anda inginkan. Jangan gunakan nama pengguna asli, masukkan menggunakan yang Anda maksudkanappusername
. Itu harus bekerja, itu untuk saya.