web-dev-qa-db-fra.com

Commentaires du script Multiline Shell - comment cela fonctionne-t-il?

Récemment, je suis tombé sur un type de commentaire multiligne que je n'avais jamais vu auparavant - voici un exemple de script:

echo a
#
: aaa 
: ddd 
#
echo b

Cela semble fonctionner, même vim syntaxe-le met en évidence. Comment s'appelle ce style de commentaire et comment trouver plus d'informations à ce sujet?

95
Wiesław Herr

Ce n'est pas un commentaire sur plusieurs lignes. # Est un commentaire sur une seule ligne. : (Deux-points) n'est pas du tout un commentaire, mais plutôt une commande intégrée de Shell qui est essentiellement un NOP , une opération nulle qui ne fait que renvoyer true, comme true (et donc mettre $? à 0 comme effet secondaire). Cependant, comme il s'agit d'une commande, il peut accepter des arguments, et comme il ignore ses arguments, dans la plupart des cas, il agit superficiellement comme un commentaire. Le principal problème avec ce kludge est que les arguments sont encore développés, conduisant à une multitude de conséquences imprévues. Les arguments sont toujours affectés par des erreurs de syntaxe, les redirections sont toujours effectuées, donc : > file Tronquera file et : $(dangerous command) les substitutions continueront de s'exécuter.

Le moyen le moins surprenant et le plus sûr pour insérer des commentaires dans les scripts Shell est avec #. Restez fidèle à cela même pour les commentaires sur plusieurs lignes. Ne jamais essayer (ab) d'utiliser : Pour les commentaires. Il n'y a pas de mécanisme de commentaire multi-lignes dédié dans Shell qui soit analogue à la forme étoile-barre oblique /* */ Dans les langues de type C.


Par souci d'exhaustivité, mais pas parce que c'est une pratique recommandée, je mentionnerai qu'il est possible d'utiliser ici-documents pour faire des "commentaires" multilignes:

: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment".  According to the POSIX spec linked 
above, if any character in the delimiter Word ("end_long_comment" in 
this case) above is quoted, the here-document will not be expanded in 
any way.  This is **critical**, as failing to quote the "end_long_comment" 
will result in the problems with unintended expansions described above. 
All of this text in this here-doc goes to the standard input of :, which 
does nothing with it, hence the effect is like a comment.  There is very 
little point to doing this besides throwing people off.  Just use '#'.
end_long_comment
140
jw013

Ce n'est pas un style de commentaire. le : la commande intégrée ne fait absolument rien; il est abusé pour avoir commenté ici.

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
29

Dans les premiers obus, le colon était le seul moyen de créer des commentaires.

Cependant, ce n'est pas un vrai commentaire, car la ligne est analysée exactement de la même manière que toute autre commande est analysée, ce qui peut avoir des effets secondaires. Par exemple:

: ${a:=x} # assigns the value 'x' to the variable, 'a'

: $(command) # executes 'command'

(Parfois, le signe deux-points est utilisé uniquement dans le but d'invoquer ces effets secondaires, mais il n'est pas utilisé comme commentaire.)

Il est parfois pratique d'utiliser les deux points pour commenter une section d'un script:

: '
while [ "$n" -ne "$x" ]
do
  : whatever
done
'

Il s'agit d'un gain de temps considérable par rapport à la précédente précédant chaque ligne avec #, en particulier si le commentaire n'est que temporaire.

26
Chris F.A. Johnson

Si votre commentaire est à la fin du script, vous pouvez le faire comme ceci:

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~
1
Steven Penny