J'ai piraté beaucoup de scripts shell, et parfois les choses les plus simples me déconcertent. Aujourd'hui, j'ai rencontré un script qui utilisait largement le :
(deux-points) bash intégré.
La documentation semble assez simple :
: (a colon) : [arguments]
Ne faites rien d'autre que développer des arguments et effectuer des redirections. Le statut de retour est zéro.
Cependant, je n'ai auparavant vu cela utilisé que dans des démonstrations d'expansion de shell. Le cas d'utilisation du script que j'ai rencontré utilisait largement cette structure :
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
Il y avait en fait des centaines de greps, mais ils sont juste plus ou moins pareils. Aucune redirection d'entrée/sortie n'est présente autre que la structure simple ci-dessus. Aucune valeur de retour n'est vérifiée ultérieurement dans le script.
Je lis ceci comme une construction inutile qui dit "ou ne rien faire". À quoi pourrait servir la fin de ces greps avec « ou ne rien faire » ? Dans quel cas cette construction entraînerait-elle un résultat différent de la simple suppression du || :
de toutes les instances ?
Réponse acceptée :
Il apparaît le :
s dans votre script sont utilisés à la place de true
. Si grep
ne trouve pas de correspondance dans le fichier, il renverra un code de sortie différent de zéro ; comme jw013 le mentionne dans un commentaire, si errexit
est défini, probablement par -e
sur la ligne shebang, le script se fermerait si l'un des grep
s ne parviennent pas à trouver une correspondance. De toute évidence, ce n'est pas ce que l'auteur voulait, alors il a ajouté || :
pour que le statut de sortie de cette commande composée particulière soit toujours zéro, comme le plus courant (selon mon expérience) || true
/|| /bin/true
.