Récemment, je suis tombé sur un type de commentaire multiligne que je navais jamais vu auparavant – voici un exemple de script:
echo a # : aaa : ddd # echo b
Cela semble fonctionner, même la syntaxe vim
le met en évidence. Comment sappelle ce style de commentaire et comment puis-je trouver plus dinformations à ce sujet?
Commentaires
Réponse
Ce nest pas un commentaire sur plusieurs lignes. #
est un commentaire sur une seule ligne. :
(deux-points) nest pas du tout un commentaire, mais plutôt une commande intégrée au shell qui est essentiellement un NOP , une opération nulle qui ne fait rien sauf renvoyer true, comme true
(et donc définir $?
à 0 comme effet secondaire). Cependant comme il sagit dune 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, ce qui entraîne une foule de conséquences inattendues. Les arguments sont toujours affectés par des erreurs de syntaxe, les redirections sont toujours effectuées afin que : > file
tronque file
et : $(dangerous command)
les substitutions seront toujours exécutées.
La manière la moins surprenante dinsérer des commentaires dans des scripts shell est avec #
. Tenez-vous-en à cela même pour les commentaires sur plusieurs lignes. Nessayez jamais dutiliser (ab) :
pour les commentaires. Il ny a pas de mécanisme de commentaire multiligne dédié dans le shell qui soit analogue à la forme slash-star /* */
dans les langages de type C
.
Par souci dexhaustivité, mais pas parce que cest une pratique recommandée, je mentionnerai quil est possible dutiliser here-documents pour faire des « commentaires » sur plusieurs lignes:
: <<"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
Commentaires
- +1 très important pour conservez les guillemets simples sur la ligne
<<
– qui désactive la substitution et lexpansion. - Et comme note supplémentaire, remplissez les scripts shell avec
:
pour les choses qui devraient être des commentaires entraînera une consommation supplémentaire de RAM / CPU. Cela na ‘ plus rien pour des choses simples sur votre bureau, mais si ‘ est quelque chose exécuté des centaines ou des milliers de fois par seconde, vous div id = « 188d9523f6 »>
: <<=cut
permet d écrire du POD dans des scripts shell, voir cet exemple pour plus de détails . Cela permet dutiliser perldoc script.sh
. Cependant, le commentaire multiligne montré dans cette réponse est quelque chose qui devrait certainement être un bloc de commentaire (chaque ligne commençant par #
). Réponse
Ce nest pas nimporte quel style de commentaire. la commande intégrée :
ne fait absolument rien; elle est utilisée abusivement pour commenter ici.
$ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds.
Réponse
Dans les premiers shells, le signe deux-points était le seul moyen de créer des commentaires.
Cependant, ce nest pas le cas un vrai commentaire, car la ligne est analysée exactement de la même manière que toute autre commande est analysée, et cela 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 dinvoquer ces effets secondaires, mais il nest pas utilisé comme commentaire.)
Il est parfois pratique dutiliser les deux-points pour commenter une section dun script:
: " while [ "$n" -ne "$x" ] do : whatever done "
Cest un excellent gain de temps en précédant chaque ligne avec #
, en particulier si le commentaire nest que temporaire.
Commentaires
- Ce simple- La méthode de commentaire quote ne fonctionne ‘ sur aucune section de script qui utilise elle-même des guillemets simples.Et si vous utilisez des guillemets aussi proches que vous le souhaitez, cela signifie que vous ‘ aurez des guillemets simples légitimes parsemés tout au long du script. Il est tellement plus simple dutiliser nimporte quel éditeur décent qui vous permet de bloquer les commentaires par ligne.
- Vous avez tout à fait raison que cela ne fonctionnera que sil ny a pas de guillemets simples dans la section citée. Cependant, un script na pas besoin davoir beaucoup de guillemets simples. En examinant quelques-uns de mes scripts, je les trouve relativement rares, et beaucoup pourraient être remplacés par des guillemets doubles.
- Le choix des guillemets simples ou doubles ne devrait guère être influencé par quelque chose daussi trivial et non pertinent. se demander si le texte de votre script est lui-même une chaîne entre guillemets simples valide. Les guillemets simples sont utilisés pour empêcher les expansions, tandis que les guillemets doubles permettent certaines expansions et nécessitent une analyse supplémentaire. Cest le vrai critère pour déterminer lequel utiliser.
- Cest de loin la manière la plus chic de le faire. Idéal pour les petits blocs de documentation. Je laime mieux que
/* */
et ugh, ne ‘ ne me lancez pas sur<!-- -->
!
Réponse
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{|}~
CommentedOutBlock() { echo "test"; }