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 :
,var
reste défini survalue
aprè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
.