Többsoros shell script megjegyzések – hogyan működik ez?

Nemrég egy olyan többsoros megjegyzés típusba botlottam, amelyet még soha nem láttam – íme egy példa a szkriptre:

echo a # : aaa : ddd # echo b 

Úgy tűnik, ez működik, még a vim szintaxis is kiemeli. Hogyan hívják ezt a kommentelési stílust, és hogyan találhatok erről további információkat?

Megjegyzések

  • Mi lenne, ha a kódot inkább funkcióba csomagolná kommentelni? CommentedOutBlock() { echo "test"; }
  • Mint mások már említették, a többsoros megjegyzések natív módon nem érhetők el. Tehát ha hamis; akkor < hány valaha kívánt sort > fi

Válasz

Ez nem többsoros megjegyzés. A # egysoros megjegyzés. A : (kettőspont) egyáltalán nem megjegyzés, hanem egy shellbe épített parancs, amely alapvetően egy NOP , egy null művelet, amely semmit nem tesz, csak a true true értéket adja vissza, például true (és így beállítja a $? 0-ig mellékhatásként). Mivel azonban parancsról van szó, elfogadhat érveket, és mivel figyelmen kívül hagyja az érveit, a legtöbb esetben felületesen viselkedik, mint egy megjegyzés. Ennek a kludge-nek a fő problémája, hogy az érvek még mindig kibővülnek, ami egy sor nem kívánt következményhez vezet. Az argumentumokat továbbra is érintik a szintaxis hibák, az átirányításokat továbbra is végrehajtják, így : > file csonka file és : $(dangerous command) helyettesítések továbbra is futni fognak.

A legkevésbé meglepő, teljesen biztonságos mód a kommentek beillesztésére a shell szkriptekbe: #. Ragaszkodjon ehhez még a többsoros megjegyzésekhez is. Soha ne próbálkozzon (ab) a : használatával a megjegyzésekhez. A héjban nincs olyan dedikált többsoros megjegyzésmechanizmus, amely analóg lenne a perjel-csillag /* */ alakkal C -szerű nyelvekben. / p>


A teljesség kedvéért, de nem azért, mert az ajánlott gyakorlat, megemlítem, hogy az itt-dokumentumok többsoros “megjegyzéseket” tenni:

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

Megjegyzések

  • +1 nagyon fontos tartsa az egyes idézőjeleket a << sorban – ez kikapcsolja a helyettesítést és a bővítést.
  • További megjegyzésként töltse ki a shell szkripteket : megjegyzésekkel járó dolgok extra RAM / CPU-fogyasztást okoznak. Nem nyert ' t az egyszerű dolgokért az asztalon, de ha ' s másodpercenként száz vagy ezerszer végrehajtott valamit, akkor ' ll ne csinálj semmit, hatalmas gyorsan .
  • @bahamat: ha végrehajtasz valami százat vagy másodpercenként több ezer alkalommal, remélem, nem nyerte meg ' t, hogy héjba írja … = /
  • Néha a null segédprogramot használja több sorhoz a szöveg hasznos lehet. A megjegyzés : <<=cut -vel kezdve lehetővé válik, hogy POD-ot írjon shell parancsfájlokba, a részleteket lásd ebben a példában . Ez lehetővé teszi a perldoc script.sh használatát. Azonban a válaszban bemutatott többsoros megjegyzés olyan dolog, amelynek feltétlenül megjegyzésblokknak kell lennie (minden sor # -vel kezdődik).
  • Itt ' jó vita a heredocs-okról, mind a megjegyzésekhez, mind más érdekes felhasználási esetekhez (még a dynaimc szkriptek generálásához is): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Válasz

Nem bármilyen stílusú kommentelés. A : beépített parancs nem tesz semmit; visszaélnek az itteni megjegyzésekkel.

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

Válasz

A korai héjakban a kettőspont volt az egyetlen mód a megjegyzések létrehozására.

Azonban nem igaz megjegyzés, mert a sort pontosan ugyanúgy elemzik, mint bármely más parancsot, és ennek lehetnek mellékhatásai. Például:

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

(Néha a kettőspont kizárólag e mellékhatások hívására szolgál, de akkor nem használják megjegyzésként.)

Néha kényelmes, ha a kettőspontot használjuk egy szkript egy részének kommenteléséhez:

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

Ez nagyszerű időmegtakarítás az egyes megelőzéshez képest. sor a következővel: #, különösen, ha a megjegyzés csak ideiglenes.

Megjegyzések

  • Ez az egyetlen az idéző kommentelési módszer nem működik ' a szkript bármely olyan szakaszán, amely maga is idézőjeleket használ.És ha bárhol használ idézőjeleket, amennyire csak kellene, akkor ez azt jelenti, hogy ' akkor törvényes egyetlen idézőjeleket szórt az egész szkriptbe. Sokkal egyszerűbb olyan tisztességes szerkesztőt használni, amely lehetővé teszi a soros megjegyzéseket.
  • Abban teljesen igazad van, hogy ez csak akkor fog működni, ha egyetlen idézőjel nincs az idézett részben. A szkriptnek azonban nem kell sok idézőjelet tartalmaznia. Néhány forgatókönyvemet áttekintve viszonylag ritkának találom őket, és sokakat kettős idézetekkel lehetne helyettesíteni.
  • Az egyetlen vagy a kettős idézet választását aligha befolyásolhatja valami olyan triviális és lényegtelen aggodalomra ad okot, hogy a szkript szövege önmagában is érvényes egyidézetű karakterlánc-e. Az egyes idézőjeleket a kibővítés megakadályozására használják, míg a dupla idézőjelek bizonyos kibővítéseket tesznek lehetővé, és további elemzést igényelnek. Ez az igazi kritérium annak meghatározására, hogy melyiket kell használni.
  • Ez messze a legfényesebb módja ennek. Nagyszerű kis dokumentációtömbökhöz. Jobban tetszik, mint /* */ és ugh, ne ' ne kezdjen bele a <!-- --> !

Válasz

Ha a megjegyzés a szkript végén van, akkor ezt így teheti:

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük