Komentáře víceřádkového skriptu – jak to funguje?

Nedávno jsem narazil na víceřádkový typ komentáře, který jsem nikdy předtím neviděl – zde je příklad skriptu:

echo a # : aaa : ddd # echo b 

Zdá se, že to funguje, dokonce i vim to zvýrazní syntaxe. Jak se tento styl komentování nazývá a jak o něm najdu více informací?

Komentáře

  • Co když místo toho zabalíte svůj kód do funkce komentovat to? CommentedOutBlock() { echo "test"; }
  • Jak již uvedli ostatní, víceřádkové komentáře nejsou nativně k dispozici. Takže používám if false; pak < kolik řádků chcete, > fi

odpověď

To není víceřádkový komentář. # je komentář v jednom řádku. : (dvojtečka) není vůbec komentář, ale spíše vestavěný příkaz prostředí, který je v podstatě NOP , operace null, která nedělá nic kromě návratu true, jako true (a tedy nastavení $? až 0 jako vedlejší účinek). Jelikož se však jedná o příkaz, může přijímat argumenty a protože ignoruje své argumenty, ve většině případů působí povrchně jako komentář. Hlavním problémem tohoto problému je, že argumenty se stále rozšiřují, což vede k řadě nezamýšlených důsledků. Argumenty jsou stále ovlivněny syntaktickými chybami, přesměrování se stále provádí, takže : > file ořízne file a : $(dangerous command) Substituce budou i nadále fungovat.

Nejméně překvapivý zcela bezpečný způsob vkládání komentářů do skriptů prostředí je pomocí #. Toho se držte i u víceřádkových komentářů. Nikdy se nepokoušejte (ab) používat : pro komentáře. Ve skořápce není žádný vyhrazený víceřádkový mechanismus komentářů, který by byl analogický s lomítkem /* */ v C podobných jazycích.


Kvůli úplnosti, ale ne proto, že se doporučuje praxe, zmíním, že je možné použít zde-dokumenty dělat víceřádkové „komentáře“:

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

Komentáře

  • +1 velmi důležité pro ponechejte jednoduché uvozovky na řádku << – tím se vypne substituce a expanze.
  • A jako zvláštní poznámku vyplnění skriptů shellu pomocí : věci, které by měly být komentáři, způsobí zvýšenou spotřebu paměti RAM / CPU. Získalo to ' t mater pro jednoduché věci na ploše, ale pokud to ' je něco provedeno stokrát nebo tisíckrát za sekundu, ' ll nic neděláte, moc rychle .
  • @bahamat: pokud provedete něco stovky nebo tisíckrát za sekundu, doufám, že jste to ' t nenapsali do shellu … = /
  • Někdy pomocí nástroje null pro více řádků text může být užitečný. Zahájení komentáře pomocí : <<=cut umožňuje napsat POD ve skriptech prostředí, podrobnosti najdete v tomto příkladu . Díky tomu lze použít perldoc script.sh. Víceřádkový komentář zobrazený v této odpovědi je však něco, co by rozhodně mělo být blokem komentářů (každý řádek začínající # ).
  • Zde ' je pěkná diskuse o heredocs, použitá jak pro komentáře, tak pro další zajímavé případy použití (včetně generování skriptů dynaimc): tldp.org/LDP/ abs / html / here-docs.html # EX71C

odpověď

to není jakýkoli styl komentování. : vestavěný příkaz nedělá absolutně nic; je zneužit pro komentování zde.

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

Odpověď

V časných skořápkách byla dvojtečka jediným způsobem, jak vytvářet komentáře.

Není to však opravdový komentář, protože řádek je analyzován přesně stejným způsobem jako jakýkoli jiný příkaz, což může mít vedlejší účinky. Například:

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

(Dvojtečka se někdy používá pouze za účelem vyvolání těchto vedlejších účinků, ale nepoužívá se jako komentář.)

Někdy je vhodné použít dvojtečku k komentování části skriptu:

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

Je to skvělý šetřič času před každým řádek s #, zejména je-li přidávání komentářů pouze dočasné.

Komentáře

  • Ten jediný Metoda komentování citací nefunguje ' na žádné části skriptu, která sama používá jednoduché uvozovky.A pokud používáte uvozovky téměř tak blízko, jak byste měli, znamená to, že ' budete mít po celém skriptu legitimní jednotlivé uvozovky. Je mnohem jednodušší použít jakýkoli slušný editor, který vám umožňuje blokovat komentáře po řádcích.
  • Máte úplnou pravdu, že to bude fungovat, pouze pokud v citované sekci nejsou žádné jednotlivé uvozovky. Skript však nemusí mít mnoho jednoduchých uvozovek. Při prohlížení několika mých skriptů mi připadají poměrně řídké a mnoho z nich by mohlo být nahrazeno uvozovkami.
  • Volba jednoduché uvozovky nebo uvozovek by měla být stěží ovlivněna něčím tak triviálním a irelevantní obavy, zda je text vašeho skriptu sám platným řetězcem s jednou uvozovkou. Jednoduché uvozovky se používají k zabránění rozšíření, zatímco uvozovky umožňují určitá rozšíření a vyžadují další analýzu. Toto jsou skutečná kritéria pro určení, které použít.
  • Toto je zdaleka nejchytřejší způsob, jak to udělat. Skvělé pro malé bloky dokumentace. Líbí se mi to lépe než /* */ a fuj, nenech mě ' začít s <!-- --> !

Odpověď

Pokud je váš komentář na konci skriptu, můžete to udělat takto:

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *