Je viens de corriger presque exactement la même situation. J'espère que cela vous aidera encore, sinon alors peut-être d'autres. Je suis parti de su, pas de sudo, mais comme sudo est destiné à encapsuler une seule autre commande, il devrait vraiment relayer le code de sortie de su. Sinon, vous pouvez également appliquer le correctif ci-dessous au niveau sudo.
Comme vous l'avez noté, le problème principal est que su exécute avec succès sa commande. L'action par défaut consiste alors à signaler qu'elle s'est terminée sans aucun problème et à renvoyer le code de sortie 0. Elle ne "sait" pas qu'un code de sortie non 0 d'une commande était inattendu ou qu'il devrait faire quelque chose avec. Ainsi, la solution est tout simplement de faire revenir su le code de sortie de sa dernière commande. Ça l'a fait pour moi
su <user_x> -c '<bunch_of_commands>; exit $?'
Dans le cas où sudo ne joue pas bien, la commande entière devrait ressembler à ceci (je vérifierais cela pour vous mais je n'ai pas sudo installé)
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
Surveillez l'imbrication des guillemets et assurez-vous que $? n'est pas développé, donc pas de guillemets doubles.
Capitaine Coder
la source
Cela fonctionne dans les shells Zsh / Bash / Bourne:
Je ne sais pas pourquoi le code retour n'est pas disponible lorsque vous le demandez dans une seule ligne, mais il est disponible lorsque vous utilisez plusieurs lignes pour faire la même chose.
la source
sudo su -m zero2cx -c "/bin/false &> /dev/null"
mais avec votre nom d'utilisateur système.$?
devrait être «1».$ USER=appusername
set comme vous le souhaitez. N'utilisez pas un vrai nom d'utilisateur, n'utilisez pas votre intentionappusername
. Ça devrait marcher, ça marche pour moi.