Comment créer des commentaires multilignes dans Bash?
226
J'ai récemment commencé à étudier le script shell et j'aimerais pouvoir commenter un ensemble de lignes dans un script shell. Je veux dire comme c'est le cas en C / Java:
:( et ajoute également une grande quantité de non- #
lisibilité
51
@ jm666 IMHO Jamais une bonne idée d'utiliser le mot jamais quand vous n'avez aucune idée de tous les cas d'utilisation.
Hiver
19
expliquer: :est un raccourci trueet truene traite aucun paramètre. (page de manuel:SYNOPSIS true [ignored command line arguments]
phil294
46
L'espace entre :et 'est important
Becko
23
J'ai légèrement modifié cela pour les blocs de code afin que je puisse facilement activer ou désactiver le code. Ma modification consiste à utiliser # 'sur la dernière ligne au lieu du guillemet simple. De cette façon, je peux mettre un single #sur la première ligne pour activer le bloc de code. Retirez la #première ligne pour désactiver le code.
JohnMudd
131
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
Cela fonctionne, la réponse actuellement acceptée ne fonctionne pas (pour moi).
Freek
5
Il convient probablement de noter que ce n'est pas un commentaire en soi. Il s'agit d'un hérédoc qui est redirigé vers la commande NOP en tant que chaîne multiligne. Le guillemet simple est important pour désactiver la résolution des variables et des commandes.
Nux
1
@Freek a besoin d'ajouter de l'espace
mazs
J'ai testé cela dans un simple script bash qui s'exécute via sa ligne shebang, #! / Bin / bash dans Debian et cela a échoué. J'essaie chaque réponse sur cette page, et elles ont toutes échoué jusqu'à ce que j'arrive à celle ci-dessous. Puisqu'ils ont échoué, je les vote contre et je vote pour celui qui fonctionne correctement.
PyTis
1
De bons tests dans votre exemple. Le leader :n'est pas nécessaire. Commencez avec <<.
wisbucky
34
Je mets à jour ce message en fonction des commentaires et autres réponses, donc les commentaires avant le 22 mai 2020 peuvent ne plus s'appliquer.
Bash ne fournit pas de syntaxe intégrée pour les commentaires sur plusieurs lignes, mais il existe des hacks utilisant la syntaxe bash existante qui "fonctionnent maintenant".
Personnellement, je pense que le plus simple (c'est-à-dire le moins bruyant, le moins bizarre, le plus facile à taper, le plus explicite) est d'utiliser un HEREDOC cité, mais de rendre évident ce que vous faites, et d'utiliser le même marqueur HEREDOC partout:
<<'### BLOCK COMMENT'
line 1
line 2
line 3
line 4### BLOCK COMMENT
Les guillemets simples du marqueur HEREDOC évitent certains effets secondaires d'analyse du shell, tels que des substitutions étranges qui provoqueraient un plantage ou une sortie, et même une analyse du marqueur lui-même. Ainsi, les guillemets simples vous donnent plus de liberté sur le marqueur de commentaire d'ouverture-fermeture. Par exemple, ce qui suit utilise un hachage triple qui suggère un commentaire sur plusieurs lignes dans bash. Cela ferait planter le script si les guillemets simples étaient absents. Même si vous supprimez ###, le FOO{}ferait planter le script (ou entraînerait une mauvaise substitution à imprimer si non set -e) s'il n'y avait pas les guillemets simples:
set-e
<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT
ls
Vous pouvez bien sûr simplement utiliser
set-e
<<'###'
something something ${FOO{}} something
more comment
###
ls
mais l'intention de ceci est certainement moins claire pour un lecteur peu familier avec cette supercherie.
De nos jours, tout bon éditeur vous permet d'appuyer sur ctrl- / ou similaire, pour annuler / commenter la sélection. Tout le monde comprend certainement cela:
# something something ${FOO{}} something# more comment# yet another line of comment
même s'il est vrai que cela n'est pas aussi pratique que le commentaire de bloc ci-dessus si vous souhaitez remplir à nouveau vos paragraphes.
Il existe sûrement d'autres techniques, mais il ne semble pas y avoir de méthode «conventionnelle». Ce serait bien si ###>et ###<pouvait être ajouté à bash pour indiquer le début et la fin du bloc de commentaires, il semble que cela pourrait être assez simple.
Comme le note la réponse précédente, à part les guillemets, la séquence $ (...) sera également développée car les deux formes sont une substitution de commande.
Perl Ancar
"Les deux sont des hacks afin qu'ils puissent casser des scripts à l'avenir." Pourriez-vous développer cela? Bien que piratant sémantiquement, syntaxiquement, ils sont valides et ne devraient pas se casser à l'avenir, à moins que bash ne décide de devenir fou et de casser les heredocs.
Perl Ancar
@perlancar Si nous convenons que les hacks sont des solutions qui utilisent une fonctionnalité language / lib qui n'est absolument pas liée au problème (comme utiliser un hérédoc pour un commentaire, ou utiliser un paramètre sur une commande de ne rien faire comme true), alors même s'ils ne ne risquez pas de casser (l'approche hérédoc ne le fait pas, mais la version deux points le fait), 1) les hacks obscurcissent toujours l'intention: sans la première ligne faisant allusion au commentaire multiligne, la plupart se gratteraient la tête en se demandant ce que fait ce code; et 2) ont des coins sombres inattendus (comme devoir doubler une citation, citer le marqueur hérédoc dans certains cas, etc.).
Oliver
@Oliver: Si elles ne sont pas citées, les variables peuvent avoir des effets secondaires désagréables. Imaginez que vous avez intégré dans votre hérédoc - commentez une chaîne telle que ${FOO:=bar}ou ${FOO{}}. Le premier peut avoir pour effet secondaire de créer et de définir la variable FOO, le second déclenchera une mauvaise erreur de substitution ; les deux effets que vous n'attendriez pas d'un vrai commentaire.
user1934428
24
Après avoir lu les autres réponses ici, j'ai trouvé ci-dessous, à mon humble avis, il est vraiment clair que c'est un commentaire. Particulièrement adapté aux informations d'utilisation dans le 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 BruceWillis or a relative of MillaJovovich.////
En tant que programmeur, la séquence de barres obliques s'inscrit immédiatement dans mon cerveau en tant que commentaire (même si les barres obliques sont normalement utilisées pour les commentaires de ligne).
Bien sûr, "////"c'est juste une chaîne; le nombre de barres obliques dans le préfixe et le suffixe doit être égal.
Excellent ajout à la réponse ci-dessus. Honnêtement, je pense que vous auriez pu modifier la réponse ci-dessus et l'ajouter au lieu de répondre séparément.
PyTis
Il y a quelques réponses "ci-dessus" (selon votre ordre de tri). Et, en répondant séparément, je voulais expliquer la raison d'être de la chaîne que j'avais choisie.
noamtm
<< EOF ... EOF
l mingzhi
5
quelle est votre opinion sur celui-ci?
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 eitherfunction giveitadifferentuniquename(){
echo nestable
}}
bonjour, n'était pas destiné comme une question, plutôt que comme une réponse à la question d'origine
Imre
Pas bon OMI. Cela nécessite que le commentaire soit analysable en tant que code shell, ce qui est assez restrictif.
user1934428
3
Voici comment je fais des commentaires multilignes en bash.
Ce mécanisme présente deux avantages que j'apprécie. La première est que les commentaires peuvent être imbriqués. L'autre est que les blocs peuvent être activés en commentant simplement la ligne de départ.
J'ai essayé la réponse choisie, mais j'ai découvert que lorsque j'exécutais un script shell, le tout était imprimé à l'écran (similaire à la façon dont les cahiers jupyter imprimaient tout entre '''xx'''guillemets) et il y avait un message d'erreur à la fin. Il ne faisait rien, mais: effrayant . Puis j'ai réalisé en le modifiant que les guillemets simples pouvaient s'étendre sur plusieurs lignes. Donc .. laisse simplement assigner le bloc à une variable.
x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"
ls -l
date
'
Pas besoin de l'affecter à une variable, ce qui est un effet secondaire que nous n'attendrions pas d'un «commentaire». Remplacez le x=par un : et vous obtenez le même effet sans effet secondaire. Le seul inconvénient est que le commentaire ne doit alors pas contenir une seule citation. C'est pourquoi je préfère l'utilisation d'un hérédoc entre guillemets: Avec cela, le commentateur peut choisir une chaîne de terminaison appropriée à sa guise.
user1934428
2
Solution simple, pas très intelligente:
Bloquer temporairement une partie d'un script:
if false;thenwhile you respect syntax a bit, please
do write here (almost) whatever you want.
but when you are
done# writefi
Une version un peu sophistiquée:
time_of_debug=false # Let's set this variable at the beginning of a scriptif $time_of_debug;then# in a middle of the script
echo I keep this code aside until there is the time of debug!fi
# J'aime la paresse et la simplicité. J'utiliserais # avec une solution de contournement amusante:
1 APPUYEZ SUR:] rechercher ctrl + F ou cmd + F ou autre [pour déclencher la fonctionnalité de recherche
2 utilisez une expression régulière dans le champ de recherche comme: (^.+)
3 remplacer par: # $1ou si vous préférez#$1
# Remarque: vous ne pouvez pas avoir les trois étapes dans votre éditeur. Dans ce cas, utilisez un outil d'expression régulière en ligne (ne pouvez pas en suggérer un ici pour des raisons de politique):
Sélectionnez, copiez le texte où que vous soyez et collez-le dans l'outil d'expression régulière en ligne
Utiliser (^.+)comme regex et #$1ou #\1comme modèles de substitution
Sélectionnez, copiez le texte et collez-le là où vous avez commencé
De nos jours, de nombreux éditeurs ont le raccourci clavier ctrl+/qui permet d'activer ou de désactiver les commentaires, même pour plusieurs lignes. Il est également capable de modifier le caractère de commentaire en fonction de la langue que vous utilisez.
:
soit dans la première colonne (pas d'espaces de tête) de la ligne.Réponses:
Utilisez
: '
pour ouvrir et'
fermer.Par exemple:
la source
#
:
est un raccourcitrue
ettrue
ne traite aucun paramètre. (page de manuel:SYNOPSIS true [ignored command line arguments]
:
et'
est important# '
sur la dernière ligne au lieu du guillemet simple. De cette façon, je peux mettre un single#
sur la première ligne pour activer le bloc de code. Retirez la#
première ligne pour désactiver le code.Commentaire multiligne dans bash
la source
:
n'est pas nécessaire. Commencez avec<<
.Je mets à jour ce message en fonction des commentaires et autres réponses, donc les commentaires avant le 22 mai 2020 peuvent ne plus s'appliquer.
Bash ne fournit pas de syntaxe intégrée pour les commentaires sur plusieurs lignes, mais il existe des hacks utilisant la syntaxe bash existante qui "fonctionnent maintenant".
Personnellement, je pense que le plus simple (c'est-à-dire le moins bruyant, le moins bizarre, le plus facile à taper, le plus explicite) est d'utiliser un HEREDOC cité, mais de rendre évident ce que vous faites, et d'utiliser le même marqueur HEREDOC partout:
Les guillemets simples du marqueur HEREDOC évitent certains effets secondaires d'analyse du shell, tels que des substitutions étranges qui provoqueraient un plantage ou une sortie, et même une analyse du marqueur lui-même. Ainsi, les guillemets simples vous donnent plus de liberté sur le marqueur de commentaire d'ouverture-fermeture. Par exemple, ce qui suit utilise un hachage triple qui suggère un commentaire sur plusieurs lignes dans bash. Cela ferait planter le script si les guillemets simples étaient absents. Même si vous supprimez
###
, leFOO{}
ferait planter le script (ou entraînerait une mauvaise substitution à imprimer si nonset -e
) s'il n'y avait pas les guillemets simples:Vous pouvez bien sûr simplement utiliser
mais l'intention de ceci est certainement moins claire pour un lecteur peu familier avec cette supercherie.
De nos jours, tout bon éditeur vous permet d'appuyer sur ctrl- / ou similaire, pour annuler / commenter la sélection. Tout le monde comprend certainement cela:
même s'il est vrai que cela n'est pas aussi pratique que le commentaire de bloc ci-dessus si vous souhaitez remplir à nouveau vos paragraphes.
Il existe sûrement d'autres techniques, mais il ne semble pas y avoir de méthode «conventionnelle». Ce serait bien si
###>
et###<
pouvait être ajouté à bash pour indiquer le début et la fin du bloc de commentaires, il semble que cela pourrait être assez simple.la source
true
), alors même s'ils ne ne risquez pas de casser (l'approche hérédoc ne le fait pas, mais la version deux points le fait), 1) les hacks obscurcissent toujours l'intention: sans la première ligne faisant allusion au commentaire multiligne, la plupart se gratteraient la tête en se demandant ce que fait ce code; et 2) ont des coins sombres inattendus (comme devoir doubler une citation, citer le marqueur hérédoc dans certains cas, etc.).${FOO:=bar}
ou${FOO{}}
. Le premier peut avoir pour effet secondaire de créer et de définir la variableFOO
, le second déclenchera une mauvaise erreur de substitution ; les deux effets que vous n'attendriez pas d'un vrai commentaire.Après avoir lu les autres réponses ici, j'ai trouvé ci-dessous, à mon humble avis, il est vraiment clair que c'est un commentaire. Particulièrement adapté aux informations d'utilisation dans le script:
En tant que programmeur, la séquence de barres obliques s'inscrit immédiatement dans mon cerveau en tant que commentaire (même si les barres obliques sont normalement utilisées pour les commentaires de ligne).
Bien sûr,
"////"
c'est juste une chaîne; le nombre de barres obliques dans le préfixe et le suffixe doit être égal.la source
Usage:
<< EOF ... EOF
quelle est votre opinion sur celui-ci?
la source
Voici comment je fais des commentaires multilignes en bash.
Ce mécanisme présente deux avantages que j'apprécie. La première est que les commentaires peuvent être imbriqués. L'autre est que les blocs peuvent être activés en commentant simplement la ligne de départ.
Dans l'exemple ci-dessus, le bloc "B" est commenté, mais les parties du bloc "A" qui ne sont pas le bloc "B" ne sont pas commentées.
L'exécution de cet exemple produira cette sortie:
la source
J'ai essayé la réponse choisie, mais j'ai découvert que lorsque j'exécutais un script shell, le tout était imprimé à l'écran (similaire à la façon dont les cahiers jupyter imprimaient tout entre
'''xx'''
guillemets) et il y avait un message d'erreur à la fin. Il ne faisait rien, mais: effrayant . Puis j'ai réalisé en le modifiant que les guillemets simples pouvaient s'étendre sur plusieurs lignes. Donc .. laisse simplement assigner le bloc à une variable.la source
x=
par un:
et vous obtenez le même effet sans effet secondaire. Le seul inconvénient est que le commentaire ne doit alors pas contenir une seule citation. C'est pourquoi je préfère l'utilisation d'un hérédoc entre guillemets: Avec cela, le commentateur peut choisir une chaîne de terminaison appropriée à sa guise.Solution simple, pas très intelligente:
Bloquer temporairement une partie d'un script:
Une version un peu sophistiquée:
la source
# J'aime la paresse et la simplicité. J'utiliserais # avec une solution de contournement amusante:
1 APPUYEZ SUR:] rechercher ctrl + F ou cmd + F ou autre [pour déclencher la fonctionnalité de recherche
2 utilisez une expression régulière dans le champ de recherche comme:
(^.+)
3 remplacer par:
# $1
ou si vous préférez#$1
# Remarque: vous ne pouvez pas avoir les trois étapes dans votre éditeur. Dans ce cas, utilisez un outil d'expression régulière en ligne (ne pouvez pas en suggérer un ici pour des raisons de politique):
(^.+)
comme regex et#$1
ou#\1
comme modèles de substitution# Profitez de vos hachages!
la source
ctrl+/
qui permet d'activer ou de désactiver les commentaires, même pour plusieurs lignes. Il est également capable de modifier le caractère de commentaire en fonction de la langue que vous utilisez.