156 votes

Quel est le cas d'utilisation de noop [:] dans bash?

J'ai cherché noop in bash (:), mais je n'ai pas pu trouver de bonne information. Quel est le but exact ou le cas d'utilisation de cet opérateur?

J'ai essayé de suivre et ça marche comme ça pour moi:

 [mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
 

S'il vous plaît laissez-moi savoir, tous les cas d'utilisation de cet opérateur en temps réel ou tout endroit où il est obligatoire de l'utiliser.

220voto

Gilles Points 37537

Il est là plus pour des raisons historiques. Le côlon builtin : est exactement équivalent à true. Il est classique d'utiliser true lorsque la valeur de retour est important, par exemple dans une boucle infinie:

while true; do
  echo 'Going on forever'
done

Il est classique d'utiliser : quand la syntaxe shell nécessite une commande mais vous n'avez rien à faire.

while keep_waiting; do
  : # busy-wait
done

L' : builtin remonte à la shell Thompson, il a été présent dans Unix v6. : a une étiquette de l'indicateur pour le shell Thompson de l' goto déclaration. Ce label pourrait être n'importe quel texte, de sorte : doublé d'un indicateur de commentaire (si il n'y a pas d' goto comment, alors : comment est effectivement un commentaire). Le Bourne shell n'avait pas goto , mais a gardé :.

Un idiome commun qui utilise : est : ${var=VALUE}, ce qui définit var de VALUE si elle a été supprimée et ne fait rien si var a déjà été défini. Cette construction n'existe que sous la forme d'une variable de substitution, et cette substitution de variable doit être une partie d'une commande en quelque sorte: un no-op commande sert bien.

Voir aussi à Quoi sert le côlon builtin servir?.

2voto

Bitdiot Points 191

Parfois, les non-op clauses peuvent rendre votre code plus lisible.

Cela peut être une question d'opinion, mais voici un exemple. Supposons que vous avez créé une fonction qui fonctionne en prenant deux chemins unix. Il calcule le "changement de voie" nécessaire pour cd à partir d'un chemin d'accès à l'autre. Vous placez une restriction sur votre fonction que les chemins d'accès doivent commencer par un '/' OU les deux, doivent pas.

function chgpath() {
    # toC, fromC are the first characters of the argument paths.
    if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]]
    then
        true      # continue with function
    else
        return 1  # Skip function.
    fi

Certains développeurs veulent supprimer la non-op mais cela signifierait la négation de la condition:

function chgpath() {
    # toC, fromC are the first characters of the argument paths.
    if [[ "$toC" != / || "$fromC" == / ]] && [[ "$toC" == / || "$fromC" != / ]]
    then
        return 1  # Skip function.
    fi

Maintenant -à mon avis - ce n'est pas si évident à partir de la si la clause des conditions dans lesquelles vous souhaitez ne pas faire la fonction. Pour éliminer la non-op et le faire clairement, vous souhaitez déplacer le si la clause de la fonction:

    if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]]
    then
        cdPath=$(chgPath pathA pathB)   # (we moved the conditional outside)

Qui semble mieux, mais de nombreuses fois, nous ne pouvons pas faire cela; nous voulons que la vérification se fait à l'intérieur de la fonction.

Donc, combien de fois est-ce possible? Pas très souvent. Peut-être une fois ou deux fois par an. Il arrive assez souvent, que vous devriez être au courant de cela. Je n'ai pas hésiter à l'utiliser quand je pense qu'il améliore la lisibilité de mon code (quelle que soit la langue).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X