Je ne fais pas beaucoup de scripts shell, donc jai été un peu surpris quand je lisais la documentation pour git submodule et jai vu la syntaxe utilisée dans cette documentation:
A un retour différent de zéro de la commande dans nimporte quel sous-module entraîne larrêt du traitement. Ceci peut être remplacé en ajoutant
|| :à la fin de la commande.
Jai dû rechercher que || : était un raccourci pour forcer une commande à se terminer avec succès. Chaque fois que jai dû faire une commande se terminer avec succès , Jai utilisé || true. Est-ce que || : est considéré comme plus idiomatique?
Commentaires
Réponse
true nétait pas intégré au shell Bourne. : la toujours été (cétait la manière de saisir des commentaires avant que # ne soit introduit).
Cela, et parce que cest probablement la raison principale pour laquelle les gens préfèrent : à true.
Notez une autre différence dans Shells POSIX (pour bash, uniquement en mode POSIX): tandis que true est un builtin normal (nest même pas nécessaire dêtre intégré) , : est un élément intégré spécial . Cela a quelques implications, dont la plupart sont peu susceptibles davoir un impact dans ce cas particulier:
-
Si une commande
:échoue, y compris en raison dune redirection échouée, qui provoque la fermeture du shell. En pratique, cela ne fera probablement aucune différence à moins que vous ne transmettiez des redirections vers:$ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE -
dans
var=value :,varreste défini survalueaprès:renvoie, pas dans le cas detrue:$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
Notez également que || true fonctionne dans les shells de rc et csh familles mais pas || : (mais pas pour annuler set -e dans csh).
|| : nest pas la même chose que :. Cela signifie ou exécutez : sinon (cest-à-dire si le pipeline précédent échoue).
set -e false
Cela ferait fermer le shell à cause de set -e (alias loption errexit) et a un statut de sortie non nul (échec). Leffet set -e est annulé si la commande qui renvoie un statut de sortie différent de zéro est utilisée comme condition comme dans:
if false; then ... while false; do ... false && : ... false || : ...
false && : annule uniquement set -e. false || : annule leffet de set -e et définit le statut de sortie sur 0 donc plus idiomatique pour dire que nous voulons ignorer un code de sortie déchec de la commande. La plupart diront que || true est plus lisible (exprime lintention plus clairement).
Commentaires
-
&& :est génial, y a-t-il des documents ou des lectures supplémentaires à ce sujet? Google ne me permet pas de trouver ce type de mots clés…
Réponse
La plupart de ces réponses échouent aborder lutilisation la plus courante de :.
Premièrement, cette discussion nest pas liée à un shell qui nest pas un Bourne shell (sh) dérivé. Cela dit, tous les shells dérivés de Bourne voient true et : comme la même chose. Les programmeurs étaient encouragés à utiliser : au lieu de true, car : est toujours un intégré alors quil y avait des cas où true nétait pas toujours un élément intégré.
: a deux utilisations. Ce nest pas un synonyme de #, mais il a une fonction différente. Lors du débogage de votre script sous un set -x, les lignes où # est utilisé sont supprimées par lanalyseur et totalement ignorées, alors que les lignes avec : sont analysés et évalués. Ceci est vraiment utile pour le débogage car sous -x ces lignes sont affichées et leur valeur après évaluation est affichée.Cest comme mettre des instructions print dans votre code qui napparaissent quen mode -x. Soyez prudent avec les valeurs après : car ce sont du code réel et les effets secondaires peuvent affecter votre programme.
Commentaires
- Quelle est la deuxième utilisation?
Réponse
Généralement, en bash, le deux points : et true est équivalent.
Est | | : considéré comme plus idiomatique?
Je pense quil est basé sur le contexte .
Si vous voulez quun return value ou un condition est toujours vrai , vous devez utiliser le mot clé true, cela rendra votre code plus clair et indiquera aux spectateurs que vous souhaitez mettre en valeur la valeur true , cest-à-dire:
while true; do something
ou
<commnad> RETURN_VALUE= $? || true
Et si vous voulez ne rien faire , ou NOP dans le shell, vous devez utiliser deux points :
if condition then : # DO NOTHING HERE else do something fi
ou
while conditon do : # DO NOTHING HERE done
||:(sans espace) est également valide en bash. Il fait la même chose que|| :ou|| true.