Ce qui est plus idiomatique dans un script bash: `|| vrai »ou« || : `?

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

  • It ' est intéressant de noter que ||: (sans espace) est également valide en bash. Il fait la même chose que || : ou || true.

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 :, var reste défini sur value après : renvoie, pas dans le cas de true:

    $ 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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *