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
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 aperldoc 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{|}~
CommentedOutBlock() { echo "test"; }