Kommentarer om skript med flera linjer – hur fungerar det?

Nyligen snubblade jag på en flertalet kommentartyp som jag aldrig har sett förut – här är ett skriptexempel:

echo a # : aaa : ddd # echo b 

Detta verkar fungera, även vim syntax-belyser det. Vad heter den här typen av kommentarer och hur hittar jag mer info om det?

Kommentarer

  • Vad händer om du istället slår in din kod i funktion för att kommentera det? CommentedOutBlock() { echo "test"; }
  • Som andra redan har nämnt finns flera radkommentarer inte tillgängliga. Så jag använder om det är falskt; sedan < hur många rader som helst du vill > fi

Svar

Det är inte en kommentar med flera rader. # är en kommentar med en rad. : (kolon) är inte alls en kommentar, utan snarare ett inbyggt skalkommando som i grunden är NOP , en nolloperation som inte gör något förutom att returnera true, som true (och därmed ställa in $? till 0 som en bieffekt). Men eftersom det är ett kommando kan det acceptera argument, och eftersom det ignorerar sina argument fungerar det i de flesta fall ytligt som en kommentar. Det största problemet med detta kludge är att argumenten fortfarande utökas, vilket leder till en mängd oavsiktliga konsekvenser. Argumenten påverkas fortfarande av syntaxfel, omdirigeringar utförs fortfarande så : > file kommer att trunka file och : $(dangerous command) -byten kommer fortfarande att köras.

Det minst överraskande helt säkra sättet att infoga kommentarer i skalskript är med #. Håll dig till det även för kommentarer med flera rader. Försök aldrig att (ab) använda : för kommentarer. Det finns ingen särskild kommentarmekanism med flera rader i skalet som är analog med snedstreckens /* */ -form på C -liknande språk.


För fullständighetens skull, men inte för att det rekommenderas, kommer jag att nämna att det är möjligt att använda här-dokument att göra ”rad” kommentarer ”:

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

Kommentarer

  • +1 mycket viktigt för behåll de enskilda citaten på << -raden – som stänger av substitution och expansion.
  • Och som en extra anteckning fyller du skalskript med : för saker som bör vara kommentarer kommer att orsaka extra RAM / CPU-förbrukning. Det vann ' t mater för enkla saker på skrivbordet, men om det ' är något som kördes hundratals eller tusentals gånger per sekund så ' ll gör ingenting, mäktigt snabbt .
  • @bahamat: om du kör något hundratals eller tusentals gånger per sekund, jag hoppas att du vann ' t skriva det i skal … = /
  • Ibland använder du null-verktyget för flera rader av text kan vara användbar. Att starta kommentaren med : <<=cut gör det möjligt att skriva POD i skalskript, se detta exempel för detaljer . Detta gör det möjligt att använda perldoc script.sh. Multiradskommentaren som visas i det här svaret är dock något som definitivt borde vara ett kommentarblock (varje rad som börjar med # ).
  • Här ' en trevlig diskussion om heredocs, används för både kommentarer och andra intressanta användningsfall (även inklusive dynaimc-skriptgenerering): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Svar

Det är inte valfri kommentarstil. : inbyggt kommando gör absolut ingenting; det missbrukas för att kommentera här.

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

Svar

I tidiga skal var kolon det enda sättet att skapa kommentarer.

Det är dock inte en riktig kommentar, eftersom raden analyseras på exakt samma sätt som alla andra kommandon analyseras, och det kan ha biverkningar. Till exempel:

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

(Ibland används kolon endast för att åberopa dessa biverkningar, men då används den inte som en kommentar.)

Det är ibland bekvämt att använda kolon för att kommentera ett avsnitt i ett manus:

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

Detta är en fantastisk tidsbesparing jämfört med föregående rad med #, särskilt om kommentaren bara är tillfällig.

Kommentarer

  • Den enda- metoden för att kommentera citat fungerar inte ' på någon del av skriptet som i sig använder enstaka citat.Och om du använder citat var som helst nära så mycket som du borde, betyder det att du ' kommer att ha legitima enskilda citat strö över hela skriptet. Det är så mycket enklare att bara använda någon anständig redaktör som låter dig blockera kommentarer från linjen.
  • Du har rätt i att det bara fungerar om det inte finns några enskilda citat i det citerade avsnittet. Ett manus behöver dock inte ha många enstaka citat. När jag tittar över några av mina skript tycker jag att de är relativt glesa, och många kan ersättas med dubbla citat.
  • Valet av enstaka citat eller dubbel citat bör knappast påverkas av något så trivialt och irrelevant oro som om texten i ditt skript i sig är en giltig enda citerad sträng. Enkla citat används för att förhindra utvidgningar, medan dubbla citat tillåter vissa utvidgningar och kräver extra tolkning. Det här är de verkliga kriterierna för att bestämma vilka som ska användas.
  • Detta är det absolut smartaste sättet att göra det på. Perfekt för små dokumentblock. Jag gillar det bättre än /* */ och ugh, don ' t starta mig på <!-- --> !

Svar

Om din kommentar finns i slutet av skriptet kan du göra det så här:

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *