293 votes

Comment créer des commentaires multilignes en Bash ?

J'ai récemment commencé à étudier le shell script et j'aimerais pouvoir commenter un ensemble de lignes dans un shell script. Je veux dire comme dans le cas de C/Java :

/* comment1
   comment2 
   comment3
*/`

Comment pourrais-je faire ça ?

2 votes

Vous pouvez utiliser un dièse comme : #ceci est un commentaire.

1 votes

Je sais mais c'est un peu gênant pour les multilignes.

2 votes

Il convient de noter que les réponses ci-dessous exigent que le : être dans la première colonne (sans espace avant) de la ligne.

530voto

Vegas Points 2566

Utilisez : ' pour ouvrir et ' pour fermer.

Par exemple :

: '
This is a
very neat comment
in bash
'

34 votes

Il ajoute également une grande quantité d'illisibilité et une source potentielle de bogues. IMHO est mieux d'utiliser plusieurs # et jamais ce...

63 votes

@jm666 IMHO Jamais une bonne idée d'utiliser ce mot. jamais quand vous n'avez aucune idée de tous les cas d'utilisation.

24 votes

Pour expliquer : : est un raccourci pour true et true ne traite aucun paramètre. (page du manuel : SYNOPSIS true [ignored command line arguments]

149voto

David Okwii Points 787

Commentaire multiligne dans bash

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT

6 votes

Cela fonctionne, la réponse actuellement acceptée ne fonctionne pas (pour moi).

5 votes

Il est probablement utile de noter que ceci n'est pas un commentaire en soi. C'est un heredoc qui est redirigé vers la commande NOP comme une chaîne de plusieurs lignes. Le guillemet simple est important pour désactiver la résolution des variables et des commandes.

1 votes

@Freek besoin d'ajouter de l'espace

47voto

Schollii Points 8020

Bash ne fournit pas de module intégré, mais il existe des astuces utilisant la syntaxe bash existante. Le plus simple est d'utiliser un HEREDOC, mais de rendre évident ce que vous faites, et d'utiliser le même marqueur HEREDOC partout :

<< --MULTILINE-COMMENT--
line 1
line 2

line 3
line 4
--MULTILINE-COMMENT--

Certains messages mentionnent que le marqueur HEREDOC doit être cité afin d'éviter certains effets secondaires de l'analyse du shell. Je n'ai trouvé cela nécessaire que si vous utilisez des guillemets dans votre commentaire. Même avec set -o verbose et $variables mentionné dans le commentaire, la citation du marqueur n'est pas nécessaire. YMMV.

Si vous utilisez le : ' mentionnée dans une autre réponse, alors documentez ce qu'il en est via un méta-commentaire, utilisez le même méta-commentaire partout et n'oubliez pas de doubler toutes les occurrences de ' dans le commentaire (un éditeur de coloration syntaxique le rendra évident) :

: 'Multiline comment:
line 1
line 2 we''re going to try this eventually
line 3
'

Les deux sont des hacks, ils pourraient donc casser des scripts à l'avenir.

Il existe sûrement d'autres techniques, mais il ne semble pas y avoir de manière "conventionnelle" de le faire.

1 votes

Ah, celui-ci est assez facile à retenir !

1 votes

Comme l'indique la réponse précédente, à part les guillemets, la séquence $(...) sera également développée car les deux formes sont des substitutions de commandes.

0 votes

"Les deux sont des hacks, donc ils pourraient casser des scripts dans le futur." Pourriez-vous développer ce point ? Bien que les hacks sémantiquement, syntaxiquement ils sont valides et ne devraient pas casser à l'avenir, à moins que bash ne décide de devenir berserk et de casser heredocs.

33voto

noamtm Points 1748

Après avoir lu les autres réponses ici, j'ai trouvé le texte ci-dessous, qui, à mon avis, indique clairement qu'il s'agit d'un commentaire. Particulièrement adapté pour les informations d'utilisation in-script :

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

En tant que programmeur, la séquence de barres obliques s'inscrit immédiatement dans mon cerveau comme un commentaire (même si les barres obliques sont normalement utilisées pour les commentaires de ligne).

Bien sûr, "////" est juste une chaîne de caractères ; le nombre de barres obliques dans le préfixe et le suffixe doit être égal.

3 votes

J'ai failli manquer le Usage:

0 votes

Excellent complément à la réponse ci-dessus. Honnêtement, je pense que vous auriez pu modifier la réponse ci-dessus, et ajouter ceci, au lieu de répondre séparément.

0 votes

Il y a quelques réponses "au-dessus" (selon l'ordre de tri). Et, en répondant séparément, j'ai voulu expliquer le raisonnement qui sous-tend la chaîne que j'ai choisie.

6voto

Imre Points 96

Quelle est votre opinion sur ce sujet ?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

0 votes

Bonjour, ce n'était pas une question, mais plutôt une réponse à la question initiale.

1 votes

Pas bon IMO. Il faut commentaire pour être analysable en tant que code shell, ce qui est assez restrictif.

0 votes

"n'était pas destiné à être une question" Alors ne pose pas de question.

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