342 votes

Quel est le but de la ' : ' (côlon) GNU Bash Builtin ?

La question, dit-il: quel serait le but d'une commande qui ne fait rien, d'être un peu plus qu'un commentaire de leader, mais en fait d'une coque intégrée et d'elle-même.

Il est plus lent que l'insertion d'un commentaire dans vos scripts, d'environ 40% par appel, ce qui a probablement varie fortement selon la taille de l'observation. La seule raison possible je peux voir pour ce sont les suivants:

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true' (lazy programming)
while : ; do command ; done

Edit: je crois que je suis à la recherche de ce que l'application historique qu'elle pouvait avoir.

421voto

earl Points 10428

Historiquement, les interpréteurs de commandes Bourne n'avait pas true et false que les commandes intégrées. true a été plutôt simplement un alias :, et false comme let 0.

: est légèrement meilleure pour la portabilité à l'ancienne Bourne dérivé de coquillages. Comme exemple simple, considérons ayant ni l' ! opérateur de pipeline, ni l' || liste de l'opérateur (comme ce fut le cas pour certaines de ses anciennes Bourne coquilles). Cela laisse à l' else clause de l' if déclaration que le seul moyen pour la ramification, basé sur le statut de sortie:

if command; then :; else ...; fi

Depuis if requiert un non-vide then de la clause, et les commentaires ne comptent pas non vide, : sert comme un no-op.

Aujourd'hui, dans un contexte moderne, vous pouvez généralement utiliser : ou true. Les deux sont spécifiés par la norme POSIX, et certains trouvent true plus facile à lire. Il existe cependant une différence intéressante: : est un soi-disant POSIX spécial intégré, alors que true est un classique intégré.

  • Spécial built-ins doivent être intégrés dans la coque; De built-ins ne sont "généralement", construite en, mais il n'est pas strictement garanti. Il ne devrait pas être un programme régulier nommé : avec la fonction d' true dans le CHEMIN d'accès de la plupart des systèmes.

  • Probablement la différence la plus fondamentale est que, avec une spéciale de built-ins, toute variable définie par la intégré- même dans l'environnement lors de la commande simple de l'évaluation - persiste après la commande est terminée, comme en témoigne ici à l'aide de ksh93:

    $ unset x; ( x=hi :; echo "$x" )
    hi
    $ ( x=hi true; echo "$x" )
    
    $
    

    Notez que Zsh ignore cette exigence, tout comme GNU Bash, sauf en cas de fonctionnement en mode de compatibilité POSIX, mais tous les autres grands "POSIX sh" dérivée " des coquilles d'observer ce y compris le tableau de bord, ksh93, et mksh.

  • Une autre différence est que la pratique régulière de built-ins doivent être compatibles avec exec - démontré ici avec Bash:

    $ ( exec : )
    -bash: exec: :: not found
    $ ( exec true )
    $
    
  • POSIX aussi précise que : peut être plus rapide que l' true, mais c'est bien sûr une mise en œuvre spécifique de détail.

64voto

Kevin Little Points 5406
<p>J’en profite pour facilement activer/désactiver les commandes variables :<pre><code></code></pre><p>Ainsi</p><pre><code></code></pre><p>Ceci en fait un script propre. Cela ne peut se faire avec « # ».</p><p>En outre,</p><pre><code></code></pre><p>est l’une des façons plus simples pour garantir que les « afile » existe mais est de longueur 0.</p></p>

60voto

ormaaj Points 3287
<p>Une application utile pour : est si vous êtes uniquement intéressé en utilisant des extensions de paramètre pour leurs effets secondaires, plutôt que de réellement passant leur résultat d’une commande. Dans ce cas, vous utilisez le PE en tant qu’argument à un : ou false selon que vous souhaitiez un état de sortie de 0 ou 1. Un exemple pourrait être <code></code> . Étant donné que <code></code> est une commande interne, il devrait être assez rapide.</p>

32voto

Greg Miernicki Points 563
<p>Si vous souhaitez tronquer un fichier à zéro octets, utiles pour effacer les journaux, essayez ceci :<pre><code></code></pre></p>

31voto

Dennis Williamson Points 105818
<p>Il est similaire à <code></code> en Python.<p>Une utilisation serait pour écraser une fonction jusqu'à ce qu’il est écrit :</p><pre><code></code></pre></p>

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