Considérer
echo \ # this is a comment
foo
Cela donne:
$ sh foo.sh
# this is a comment
foo.sh: line 2: foo: command not found
Après quelques recherches sur le web, j'ai trouvé une solution de DigitalRoss sur le site sœur Stack Overflow. On peut donc faire
echo `: this is a comment` \
foo
Ou bien
echo $(: this is a comment) \
foo
Cependant, DigitalRoss n'a pas expliqué pourquoi ces solutions fonctionnent. J'apprécierais une explication. Il a répondu avec un commentaire:
Il y avait auparavant une
goto
commande shell qui se ramifiait aux étiquettes spécifiées comme:
ici. Legoto
est parti mais vous pouvez toujours utiliser la: whatever
syntaxe ...:
est une sorte de commentaire analysé maintenant.
Mais j'aimerais plus de détails et de contexte, y compris une discussion sur la portabilité.
Bien sûr, si quelqu'un a d'autres solutions, ce serait bien aussi.
Voir aussi la question précédente Comment commenter des commandes multilignes dans des scripts shell? .
Retenez le message de la discussion ci-dessous. C'est `: this is a comment`
juste une substitution de commande. La sortie de : this is a comment
n'est rien, et cela se met à la place de `: this is a comment`
.
Un meilleur choix est le suivant:
echo `# this is a comment` \
foo
make_FIND
un script quickie qui construit une longue liste d'arguments pourfind
. Ici, la motivation pour le construire morceau par morceau est que chaque morceau provient du corps d'une boucle, mais le même style permet de commenter chaque morceau.Vous pouvez y parvenir en utilisant des tableaux Bash, par exemple
Cela définit un tableau,
$CMD
puis le développe. Une fois développée, la ligne résultante est évaluée, dans ce cas, elleecho foo
est exécutée.Le texte entre
(
et)
définit le tableau et est soumis à la syntaxe bash habituelle, donc tout sur une ligne après#
est ignoré.Remarque sur la conservation des espaces blancs entre guillemets
${CMD[@]}
se développe en une seule chaîne qui est la concaténation de tous les éléments, séparés par un espace. Une fois développée, Bash analyserait alors la chaîne en jetons de la manière habituelle (cf. $ IFS ), ce qui n'est souvent pas ce que nous voulons.En revanche, si l'expansion est entourée de guillemets doubles, c'est
"${CMD[@]}"
-à- dire que chaque élément du tableau est conservé. Considérez la différence entrehello world second item
et"hello world" "second item"
.Exemple illustratif:
la source
${CMD[@]}
ne se développe pas en une seule chaîne. - Il s'étend à de nombreuses chaînes: pas seulement divisé pour chaque élément du tableau, mais également sur les espaces dans chaque élément. (C'est-à-dire: complètement inutile)Ne fais pas ça
$(: comment)
. Ce n'est pas un commentaire - c'est un sous-shell - un tout autre processus de shell pour la plupart des shells. Votre objectif est de faire moins avec votre contribution, pas plus, ce que cela ferait - même si c'est inutile.Vous pouvez plutôt faire ...
Fondamentalement, ce qui se passe, c'est que le shell effectue une substitution. Il remplace la valeur du paramètre shell spécial
$-
deux fois à chaque fois. C'est une chaîne courte de toute façon, mais elle est toujours définie - et donc la substitution interne - qui est interprétée comme un motif à supprimer de l'extérieur - ne se développe pas jusqu'au contenu entre les parenthèses lorsque j'utilise le-
formulaire d'expansion.Ici:
Voir? Il est donc simplement agrandi deux fois. Dès que le shell trouve que le paramètre est défini, tout dans le champ d'extension optionnel est jeté, à peu près, et il se développe à sa valeur entière qui est supprimée de lui-même et donc à rien du tout. Dans la plupart des shells, vous n'avez même pas besoin d'échapper aux guillemets, mais vous en avez besoin
bash
.Mieux encore:
la source