Multiline shell-scriptcommentaar – hoe werkt dit?

Onlangs kwam ik een commentaartype met meerdere regels tegen dat ik nog nooit eerder heb gezien – hier is een scriptvoorbeeld:

echo a # : aaa : ddd # echo b 

Dit lijkt te werken, zelfs vim syntax-benadrukt het. Hoe heet deze stijl van reageren en hoe kan ik er meer informatie over vinden?

Opmerkingen

  • Wat als je in plaats daarvan je code in de functie verpakt om commentaar geven? CommentedOutBlock() { echo "test"; }
  • Zoals anderen al hebben vermeld, zijn commentaren met meerdere regels niet standaard beschikbaar. Dus ik gebruik if false; dan < hoeveel regels je ooit wilt > fi

Antwoord

Dat is geen commentaar van meerdere regels. # is een opmerking van één regel. : (dubbele punt) is helemaal geen commentaar, maar eerder een in de shell ingebouwd commando dat in feite een NOP , een null-bewerking die niets anders doet dan true retourneren, zoals true (en dus $? op 0 als bijwerking). Omdat het echter een commando is, kan het argumenten accepteren, en aangezien het zijn argumenten negeert, werkt het in de meeste gevallen oppervlakkig als commentaar. Het grootste probleem met deze kludge is dat de argumenten nog steeds worden uitgebreid, wat leidt tot een groot aantal onbedoelde gevolgen. De argumenten worden nog steeds beïnvloed door syntaxisfouten, omleidingen worden nog steeds uitgevoerd, dus : > file zal file afkappen en : $(dangerous command) vervangingen zullen nog steeds worden uitgevoerd.

De minst verrassende volledig veilige manier om commentaar in shell-scripts in te voegen is met #. Blijf daar zelfs bij voor commentaren met meerdere regels. Nooit proberen om (ab) : te gebruiken voor opmerkingen. Er is geen speciaal meerregelig commentaarmechanisme in de shell dat analoog is aan de slash-star /* */ vorm in C -achtige talen.


Voor de volledigheid, maar niet omdat het een aanbevolen praktijk is, zal ik vermelden dat het mogelijk is om hier-documenten om meerregelige “comments” te doen:

: <<"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 

Reacties

  • +1 zeer belangrijk voor bewaar de enkele aanhalingstekens op de << regel – dat schakelt vervanging en uitbreiding uit.
  • En als een extra opmerking, vul shellscripts met : voor dingen die commentaar zouden moeten zijn, zal extra RAM / CPU-verbruik veroorzaken. Het won ‘ t mater voor eenvoudige dingen op uw bureaublad, maar als het ‘ iets is dat honderden of duizenden keren per seconde wordt uitgevoerd, ‘ ll niets doen, enorm snel .
  • @bahamat: als je iets honderden uitvoert of duizenden keren per seconde, ik hoop dat je ‘ gewonnen hebt om het in shell te schrijven … = /
  • Soms gebruik je het hulpprogramma null voor meerdere regels tekst kan nuttig zijn. Door de opmerking te starten met : <<=cut is het mogelijk om POD in shell-scripts te schrijven, zie dit voorbeeld voor details . Dit maakt het mogelijk om perldoc script.sh te gebruiken. Het commentaar van meerdere regels dat in dit antwoord wordt getoond, is echter iets dat zeker een commentaarblok zou moeten zijn (elke regel begint met # ).
  • Hier ‘ een leuke discussie over heredocs, gebruikt voor zowel commentaren als andere interessante use cases (zelfs inclusief dynaimc script generatie): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Antwoord

Het is niet elke stijl van commentaar. het : ingebouwde commando doet absoluut niets; het wordt misbruikt om hier commentaar te geven.

$ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds. 

Antwoord

In vroege shells was de dubbele punt de enige manier om commentaar te creëren.

Dit is echter niet het geval een echte opmerking, omdat de regel op precies dezelfde manier wordt geparseerd als elk ander commando, en dat kan bijwerkingen hebben. Bijvoorbeeld:

: ${a:=x} # assigns the value "x" to the variable, "a" : $(command) # executes "command" 

(Soms wordt de dubbele punt alleen gebruikt om die bijwerkingen op te roepen, maar dan wordt hij niet als commentaar gebruikt.)

Het is soms handig om de dubbele punt te gebruiken om commentaar te geven op een sectie van een script:

: " while [ "$n" -ne "$x" ] do : whatever done " 

Dit is een grote tijdwinst ten opzichte van elke regel met #, vooral als het commentaar slechts tijdelijk is.

Reacties

  • Die enkele- quote commenting-methode werkt niet ‘ op enig gedeelte van het script dat zelf enkele aanhalingstekens gebruikt.En als u overal aanhalingstekens gebruikt die in de buurt komen van wat u zou moeten, betekent dat dat u ‘ legitieme enkele aanhalingstekens door het hele script zult hebben. Het is zoveel eenvoudiger om gewoon een fatsoenlijke editor te gebruiken waarmee je regelgewijze opmerkingen kunt blokkeren.
  • Je hebt volkomen gelijk dat het alleen zal werken als er geen enkele aanhalingstekens in de geciteerde sectie staan. Een script hoeft echter niet veel enkele aanhalingstekens te bevatten. Als ik een paar van mijn scripts doorkijk, vind ik ze relatief schaars, en veel zouden kunnen worden vervangen door dubbele aanhalingstekens.
  • De keuze tussen enkele aanhalingstekens of dubbele aanhalingstekens mag nauwelijks worden beïnvloed door zoiets triviaal en irrelevant. zorg ervoor dat de tekst van uw script zelf een geldige tekenreeks met enkele aanhalingstekens is. Enkele aanhalingstekens worden gebruikt om uitbreidingen te voorkomen, terwijl dubbele aanhalingstekens bepaalde uitbreidingen toestaan en extra ontleden vereisen. Dit zijn de echte criteria om te bepalen welke te gebruiken.
  • Dit is verreweg de chicste manier om het te doen. Geweldig voor kleine blokken documentatie. Ik vind het leuker dan /* */ en ugh, ‘ laat me niet beginnen op <!-- --> !

Answer

Als je commentaar aan het einde van het script staat, kun je het als volgt doen:

#!/bin/sh echo "hello world" exec true we can put whatever we want here \"\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ abcdefghijklmnopqrstuvwxyz{|}~ 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *