Kommentarer til multiline shell-script – hvordan fungerer dette?

For nylig snuble jeg over en multiline kommentartype, som jeg aldrig har set før – her er et scripteksempel:

echo a # : aaa : ddd # echo b 

Dette ser ud til at fungere, selv vim syntaks-fremhæver det. Hvad kaldes denne kommentarstil, og hvordan finder jeg mere information om det?

Kommentarer

  • Hvad hvis du i stedet pakker din kode ind i funktion til kommentere det? CommentedOutBlock() { echo "test"; }
  • Som andre allerede har nævnt, er flerlinjekommentarer ikke tilgængelige. Så jeg bruger hvis falsk; så < hvor mange linjer du nogensinde vil have > fi

Svar

Det er ikke en kommentar med flere linjer. # er en enkelt linjekommentar. : (kolon) er slet ikke en kommentar, men snarere en shell-indbygget kommando, der grundlæggende er en NOP , en null-handling, der ikke gør andet end at returnere true, som true (og dermed indstiller $? til 0 som en bivirkning). Men da det er en kommando, kan det acceptere argumenter, og da det ignorerer dets argumenter, fungerer det i de fleste tilfælde overfladisk som en kommentar. Hovedproblemet med dette kludge er, at argumenterne stadig udvides, hvilket fører til en række utilsigtede konsekvenser. Argumenterne påvirkes stadig af syntaksfejl, omdirigeringer udføres stadig, så : > file trunkerer file, og : $(dangerous command) udskiftninger kører stadig.

Den mindst overraskende helt sikre måde at indsætte kommentarer i shell-scripts er med #. Hold dig til det, selv for kommentarer i flere linjer. Forsøg aldrig at (ab) bruge : til kommentarer. Der er ingen dedikeret multi-line kommentarmekanisme i shell, der er analog med skråstreg /* */ form på C -lignende sprog.


For fuldstændighedens skyld, men ikke fordi det anbefales praksis, vil jeg nævne, at det er muligt at bruge her-dokumenter at lave “kommentarer” med flere linjer:

: <<"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 meget vigtigt for hold de enkelte citater på << -linjen – der slukker for erstatning og udvidelse.
  • Og som en ekstra note, udfyldning af shell-scripts med : for ting, der skal være kommentarer, vil medføre ekstra RAM / CPU-forbrug. Det vandt ' t mater for enkle ting på dit skrivebord, men hvis det ' er noget udført hundreder eller tusinder af gange i sekundet, skal du ' ll gør ingenting, mægtigt hurtigt .
  • @bahamat: hvis du udfører noget hundreder eller tusinder af gange i sekundet, jeg håber, du vandt ' for ikke at skrive det i shell … = /
  • Nogle gange bruger du null-værktøjet til flere linjer med tekst kan være nyttig. At starte kommentaren med : <<=cut gør det muligt at skrive POD i shell-scripts, se dette eksempel for detaljer . Dette gør det muligt at bruge perldoc script.sh. Multi-linjekommentaren vist i dette svar er dog noget, der bestemt bør være en kommentarblok (hver linje startende med # ).
  • Her ' en god diskussion om heredocs, der bruges til både kommentarer og andre interessante brugssager (selv inklusive dynaimc-generering af script): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Svar

Det er ikke enhver kommentarstil. : indbygget kommando gør absolut intet; den misbruges for at kommentere her.

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

Svar

I tidlige skaller var kolon den eneste måde at oprette kommentarer på.

Det er dog ikke en ægte kommentar, fordi linjen er parset på nøjagtig samme måde som enhver anden kommando parses, og det kan have bivirkninger. For eksempel:

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

(Undertiden bruges kolon udelukkende med det formål at påberåbe sig disse bivirkninger, men så bruges det ikke som en kommentar.)

Det er undertiden praktisk at bruge kolon til at kommentere et afsnit i et script:

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

Dette er en god tidsbesparelse i forhold til hver enkelt linje med #, især hvis kommentaren kun er midlertidig.

Kommentarer

  • Denne enkelt- metoden til at kommentere citater fungerer ikke ' på nogen sektion i scriptet, der selv bruger enkelt-citater.Og hvis du bruger anførselstegn overalt i nærheden af så meget som du burde, betyder det, at du ' vil have legitime enkelt citater drysset over hele scriptet. Det er så meget lettere at bare bruge en hvilken som helst anstændig editor, der giver dig mulighed for at blokere liniekommentarer.
  • Du har ret i, at det kun fungerer, hvis der ikke er nogen enkelt citater i det citerede afsnit. Imidlertid behøver et script ikke have mange enkelt citater. Når jeg ser over et par af mine scripts, finder jeg dem relativt sparsomme, og mange kunne erstattes af dobbelt citater.
  • Valget af enkelt citat eller dobbelt citat bør næppe påvirkes af noget så trivielt og irrelevant bekymring som om teksten i dit script i sig selv er en gyldig enkeltciteret streng. Enkelt tilbud bruges til at forhindre udvidelser, mens dobbelt tilbud giver mulighed for visse udvidelser og kræver ekstra parsing. Dette er de virkelige kriterier for at bestemme, hvilken der skal bruges.
  • Dette er langt den smarteste måde at gøre det på. Perfekt til små blokke af dokumentation. Jeg kan godt lide det bedre end /* */ og ugh, don ' for ikke at komme mig i gang på <!-- --> !

Svar

Hvis din kommentar er i slutningen af scriptet, kan du gøre det sådan:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *