Comment:

j'ai trouvé une bonne réponse pour comment commentaire en bash script (par @sunny256 ):

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment

les ' et ' autour du délimiteur END sont importants, sinon les choses à l'intérieur du bloc comme par exemple $(command) seront analysées et exécutées.

c'est peut-être moche, mais ça marche et je veux savoir ce que ça veut dire. Peut quelqu'un l'expliquer simplement? J'ai déjà trouvé une explication pour : que c'est non-op ou vrai. Mais il n'a pas de sens pour moi d'appeler sans-op ou vrai de toute façon....

6
demandé sur codeforester 2015-08-20 22:22:45
la source

3 ответов

je crains que cette explication soit moins "simple" et plus "approfondie", mais nous y voilà.

le but d'un commentaire est d'être un texte qui est et non interprété ou exécuté comme code.

à l'origine, le shell UNIX n'avait pas de syntaxe de commentaire en soi . Il a, cependant, la commande nulle : (une fois un programme binaire réel sur le disque, /bin/: ), qui ignore ses arguments et ne fait rien d'autre que d'indiquer une exécution réussie au shell appelant. En fait, c'est un synonyme de true qui ressemble à une ponctuation au lieu d'un mot, donc vous pouvez mettre une ligne comme ça dans votre script:

: This is a comment

ce n'est pas tout à fait un commentaire traditionnel; c'est toujours une commande réelle que l'interpréteur de commandes exécute. Mais puisque le commandement ne do rien, sûrement il est assez proche: mission accomplie! Droit?

Le problème est que la ligne est encore traitée comme une commande au-delà de l'exécuter en tant que. Plus important encore, l'analyse lexicale - la substitution de paramètres, le dédoublement de mots, etc. - s'effectue encore sur des arguments destinés à être ignorés. Un tel traitement signifie que vous courez le risque d'une erreur de syntaxe dans un "commentaire" écrasant tout votre script:

 : Now let's see what happens next
 echo "Hello, world!"
 #=> hello.sh: line 1: unexpected EOF while looking for matching `''

ce problème a conduit à l'introduction d'une véritable syntaxe de commentaire: la désormais familière # . Tout de # à la fin de la ligne est complètement ignoré par le shell, donc vous pouvez y mettre tout ce que vous voulez sans vous soucier de la validité syntaxique:

 # Now let's see what happens next
 echo "Hello, world!"
 #=> Hello, world!

et c'est comment le Shell a obtenu sa syntaxe de commentaire .

cependant, vous étiez à la recherche d'un commentaire multi-ligne (bloc), du type introduit par /* (et terminé par */ ) en C ou Java. Malheureusement, la coquille simplement ne pas avoir une telle syntaxe. La façon normale de commenter un bloc de lignes consécutives - et celle que je recommande - est simplement de mettre un # devant chacun d'eux. Mais il ne s'agit pas d'une approche particulièrement "multiligne".

la solution que vous avez trouvée utilise ce qu'on appelle un ici-document . La syntaxe some-command <<whatever provoque les lignes de texte suivantes - À partir de la ligne immédiatement après la commande, jusqu'à, mais sans inclure ligne suivante ne contenant que le texte whatever - à lire et alimenter comme entrée standard au some-command . Voici une implémentation shell alternative de "Hello, world" qui tire profit de cette fonctionnalité:

cat <<EOF
Hello, world
EOF

si vous remplacez cat par notre vieil ami : , vous constaterez qu'il ignore non seulement ses arguments mais aussi son input: vous pouvez lui donner tout ce que vous voulez, et il ne fera toujours rien (et encore indiquer qu'il a fait que rien réussi.)

cependant, le contenu d'un document here-est soumis à un traitement de chaîne. Donc, tout comme avec le commentaire en ligne simple : , la version ici-document court le risque d'erreurs de syntaxe à l'intérieur de ce qui n'est pas censé être du code exécutable:

#!/bin/sh -e 
: <<EOF
(This is a backtick: `)
EOF
echo 'In modern shells, $(...) is preferred over backticks.'
#=> ./demo.sh: line 2: bad substitution: no closing "`" in `

la solution, comme le montre le code que vous avez trouvé, est de citer le sentinel de fin de document sur la ligne présentant le document ici (par exemple <<'EOF' ). Le fait de faire cela provoque l'ensemble corps du document-à traiter comme du texte littéral-aucun élargissement de paramètre ou autre traitement ne se produit. Au lieu de cela, le texte est envoyé à la commande unchanged, tout comme s'il était lu à partir d'un fichier. Ainsi, à l'exception d'une ligne constituée uniquement de la chaîne terminator ( EOF ou END ou autre), le document here peut contenir n'importe quel caractère:

#!/bin/sh -e
: <<'EOF'
This is a backtick: `
EOF
echo 'In modern shells, $(...) is preferred over backticks.'
#=> In modern shells, $(...) is preferred over backticks.

(il est intéressant de noter que le chemin vous citez le sentinelle n'a pas d'importance, vous pouvez utiliser <<'EOF' , <<E"OF" , ou même <<EO\F ; tous ont le même résultat. C'est différent de la façon dont les documents fonctionnent dans D'autres langues, comme Perl et Ruby, où le contenu est traité différemment selon la façon dont le sentinel est cité.)

nonobstant tout ce qui précède, je vous recommande fortement de mettre un # au début de chaque ligne que vous voulez commenter. N'importe quel code décent l'éditeur va rendre cette opération facile - même simple Vieux vi - et l'avantage est que personne lisant votre code aura à dépenser de l'énergie à comprendre ce qui se passe avec quelque chose qui est, après tout, destiné à être de la documentation pour leur bénéfice.

25
répondu Mark Reed 2018-09-06 02:40:47
la source

, Il est appelé Ici Recherche t. C'est un bloc de code qui vous permet d'envoyer une liste de commandes à une autre commande ou le programme

la chaîne qui suit le << est le marqueur qui détermine l'extrémité du bloc. Si vous envoyez des commandes à no-op, rien ne se passe, c'est pourquoi vous pouvez l'utiliser comme bloc de commentaires.

1
répondu jwde 2015-08-20 22:28:34
la source

c'est la syntaxe heredoc . C'est une façon de définir la littérature multi-cordes.

comme l'explique la réponse à votre lien, les guillemets simples autour de la fin désactivent l'interpolation, de la même manière que les chaînes à guillemet simple désactivent l'interpolation dans les chaînes régulières de bash.

0
répondu Doug F 2015-08-20 22:27:15
la source

Autres questions sur