web-dev-qa-db-fra.com

Pourquoi le modèle "command || true" est-il utile?

J'explore actuellement des paquets Debian et j'ai lu des exemples de code. Et sur chaque ligne, par exemple, le script postinst est un modèle.

some command || true
another command || true

Donc, si une commande échoue, la ligne renvoie true mais je ne vois pas comment cela affecte la sortie du programme.

84
carpenter

La raison de ce modèle est que les scripts de maintenance dans les paquets Debian ont tendance à commencer par set -e, ce qui provoque la fermeture du shell dès qu'une commande (à proprement parler, pipeline, liste ou commande composée) se termine avec un état différent de zéro. Cela garantit que les erreurs ne s'accumulent pas: dès que quelque chose se passe mal, le script s'interrompt.

Dans les cas où une commande du script est autorisée à échouer, l'ajout de || true garantit que la commande composée résultante se termine toujours avec le statut zéro, afin que le script ne s'interrompe pas. Par exemple, la suppression d'un répertoire ne doit pas être une erreur fatale (empêcher la suppression d'un package); nous utiliserions donc

rmdir ... || true

puisque rmdir n'a pas d'option pour lui dire d'ignorer les erreurs.

157
Stephen Kitt

Bien qu'il n'affecte pas la sortie du programme, il suffit de l'exécuter - il permet à l'appelant de procéder comme si tout allait bien, ce qui affecte la logique future.

Reformulé: il masque l'erreur status de la commande précédente.

michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false

michael@x071:[/usr/sbin]cat /tmp/true.sh 
#!/bin/sh
false || true

michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $? 
0
33
Michael Felt