Kommentarer om multiline skallskript – hvordan fungerer dette?

Nylig snublet jeg over en flerlinjet kommentartype jeg aldri har sett før – her er et skripteksempel:

echo a # : aaa : ddd # echo b 

Dette ser ut til å fungere, selv vim syntaksen fremhever det. Hva heter denne stilen av kommentarer og hvordan kan jeg finne mer informasjon om det?

Kommentarer

  • Hva om du i stedet pakker koden inn i funksjon til kommentere det? CommentedOutBlock() { echo "test"; }
  • Som andre allerede har nevnt, er ikke flere linjekommentarer tilgjengelige. Så jeg bruker hvis falsk; så < hvor mange linjer du vil > fi

Svar

Det er ikke en kommentar med flere linjer. # er en enkeltradkommentar. : (kolon) er ikke en kommentar i det hele tatt, men heller en shell-innebygd kommando som i utgangspunktet er NOP , en nulloperasjon som ikke gjør noe annet enn å returnere true, som true (og dermed angir $? til 0 som en bivirkning). Men siden det er en kommando, kan det akseptere argumenter, og siden det ignorerer argumentene, fungerer det i de fleste tilfeller overfladisk som en kommentar. Hovedproblemet med denne kludgen er at argumentene fortsatt utvides, noe som fører til en rekke utilsiktede konsekvenser. Argumentene er fortsatt påvirket av syntaksfeil, omdirigeringer blir fremdeles utført, så : > file vil avkorte file, og : $(dangerous command) erstatninger vil fremdeles kjøre.

Den minst overraskende helt sikre måten å sette inn kommentarer i skallskript er med #. Hold deg til det selv for kommentarer med flere linjer. Forsøk aldri å (ab) bruke : for kommentarer. Det er ingen dedikert multilinjemerkemekanisme i skallet som er analog med skråstjerne /* */ form på C -lignende språk.


For fullstendighetens skyld, men ikke fordi det anbefales praksis, vil jeg nevne at det er mulig å bruke her-dokumenter for å gjøre «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 veldig viktig å beholder de enkle anførselstegnene på << -linjen – som deaktiverer erstatning og utvidelse.
  • Og som et ekstra notat fyller du skallskript med : for ting som burde være kommentarer vil føre til ekstra RAM / CPU-forbruk. Det vant ' t mater for enkle ting på skrivebordet, men hvis det ' er noe utført hundrevis eller tusen ganger i sekundet, ' ll gjør ingenting, mektig fort .
  • @bahamat: hvis du utfører noe hundrevis eller tusenvis av ganger i sekundet, jeg håper du vant ' t å skrive det i skall … = /
  • Noen ganger bruker du nullverktøyet for flere linjer med tekst kan være nyttig. Å starte kommentaren med : <<=cut gjør det mulig å skrive POD i skallskript, se dette eksemplet for detaljer . Dette gjør det mulig å bruke perldoc script.sh. Multilinjekommentaren vist i dette svaret er imidlertid noe som absolutt burde være en kommentarblokk (hver linje som begynner med # ).
  • Her ' en fin diskusjon om heredocs, brukt til både kommentarer og andre interessante brukstilfeller (til og med inkludert dynaimc-skriptgenerering): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Svar

Det er ikke enhver kommentarstil. : innebygd kommando gjør absolutt ingenting; den misbrukes for å kommentere her.

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

Svar

I tidlige skall var kolon den eneste måten å lage kommentarer.

Det er imidlertid ikke en sann kommentar, fordi linjen er analysert på nøyaktig samme måte som alle andre kommandoer blir analysert, og det kan ha bivirkninger. For eksempel:

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

(Noen ganger brukes kolon bare for å påkalle disse bivirkningene, men da blir det ikke brukt som en kommentar.)

Det er noen ganger praktisk å bruke kolon for å kommentere en del av et skript:

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

Dette er en flott tidsbesparelse i forhold til hver linje med #, spesielt hvis kommentaren bare er midlertidig.

Kommentarer

  • Denne singel- sitatkommenteringsmetode fungerer ikke ' på noen del av skriptet som i seg selv bruker enkelt anførselstegn.Og hvis du bruker anførselstegn i nærheten av så mye som du burde, betyr det at du ' har legitime enkeltsitater som er strødd over hele skriptet. Det er så mye enklere å bare bruke en hvilken som helst anstendig redaktør som lar deg blokkere kommentarer på linje.
  • Du har helt rett i at det bare vil fungere hvis det ikke er noen sitater i den siterte delen. Imidlertid trenger et skript ikke ha mange enkelt sitater. Når jeg ser på noen få av skriptene mine, synes jeg de er relativt sparsomme, og mange kan erstattes av doble anførselstegn.
  • Valget av enkelt sitat eller dobbelt sitat bør neppe påvirkes av noe så trivielt og irrelevant bekymring som om teksten i skriptet i seg selv er en gyldig enkelt sitert streng. Enkelt anførselstegn brukes for å forhindre utvidelser, mens doble anførselstegn tillater visse utvidelser og krever ekstra parsing. Dette er de virkelige kriteriene for å bestemme hvilken som skal brukes.
  • Dette er den desidert flotteste måten å gjøre det på. Flott for små blokker med dokumentasjon. Jeg liker det bedre enn /* */ og ugh, ikke ' t får meg i gang på <!-- --> !

Svar

Hvis kommentaren din er på slutten av skriptet, kan du gjøre det slik:

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *