Est-il possible de conserver le dernier état de sortie de commande ( $?
) inchangé après un test?
Par exemple, je voudrais faire:
command -p sudo ...
[ $? -ne 1 ] && exit $?
Le dernier exit $?
doit retourner le statut de sortie sudo, mais à la place il retourne toujours 0
(le code de sortie du test).
Est-il possible de le faire sans variable temporaire?
Un autre exemple pour clarifier davantage:
spd-say "$@"
[ $? -ne 127 ] && exit $?
Dans ce cas, je veux quitter uniquement si la première commande est trouvée (code de sortie! = 127
). Et je veux quitter avec le spd-say
code de sortie réel (ce n'est peut-être pas le cas
0
).
EDIT: J'ai oublié de mentionner que je préfère une solution de réclamation POSIX pour une meilleure portabilité.
J'utilise cette construction dans des scripts où je veux fournir des alternatives pour la même commande. Par exemple, consultez mon script crc32 .
Le problème avec les variables temporaires est qu'elles peuvent masquer d'autres variables et pour éviter que vous ne deviez utiliser des noms longs, ce qui n'est pas bon pour la lisibilité du code.
[ $? -ne 127 ] && exit $?
)
sudo
commande réussit (c'est-à-dire s'il se sudo
termine avec le statut 0). Mais, dans votre code, le script continue de s'exécuter (ne se ferme pas) en cas de sudo
succès
command
et pas sudo
du tout. C'est ce que signifie que je veux quitter uniquement si la première commande est trouvée (code de sortie! = 127) et est un retour spécifiécommand
lorsque la commande qu'il appelle n'est pas trouvée. Je suppose que le problème est que l'invocation sudo
dans le cadre du test permet en premier lieu d' sudo
écraser le retour command
et donc de biaiser le test.
if ! command -p sudo; then exit; fi
ce qui aurait les mêmes résultats pour votre exemple.