it-swarm-eu.dev

Komentáře skriptů Multiline Shell - 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 syntaxe vim zdůrazňuje. Jak se tento styl komentování nazývá a jak o něm najdu více informací?

95
Wiesław Herr

Nejedná se o víceřádkový komentář. # Je jednorázový komentář. : (Dvojtečka) není vůbec komentář, ale spíše vestavěný příkaz Shell, který je v podstatě NOP , nulová operace, která nedělá nic kromě návratu true, jako true (a tedy nastavení $? na 0 jako vedlejší účinek). Jelikož se však jedná o příkaz, může přijímat argumenty a protože ignoruje jeho argumenty, ve většině případů působí povrchně jako komentář. Hlavním problémem této kludge je, že argumenty jsou stále rozšířeny, což vede k hostiteli nezamýšlených důsledků. Argumenty jsou stále ovlivněny chybami syntaxe, přesměrování se stále provádí, takže : > file Zkrátí file a substituce : $(dangerous command) budou stále spuštěny.

Nejméně překvapující zcela bezpečný způsob vkládání komentářů do skriptů Shell je s #. Držte se toho i pro víceřádkové komentáře. Nikdy se nepokoušíte (ab) použít : Pro komentáře. V prostředí Shell neexistuje žádný vyhrazený mechanismus víceřádkových komentářů, který by byl analogický s lomítkem /* */ Ve hvězdných jazycích podobných C.


Pro úplnost, ale ne proto, že se doporučuje praxe, zmíním, že je možné použít zde-dokumenty pro 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
140
jw013

Není to žádný styl komentování. : vestavěný příkaz nedělá absolutně nic; je to zneužíváno pro komentování zde.

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
29

V časných granátech bylo tlusté střevo jediným způsobem, jak vytvořit komentáře.

Nejedná se však o pravdivý 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'

(Někdy se tlusté střevo používá pouze za účelem vyvolání těchto vedlejších účinků, ale pak se nepoužívá jako komentář.)

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

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

To je skvělý časovač oproti předchozímu řádku s #, zejména pokud je komentář pouze dočasný.

26

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:;<=>[email protected][\]^_
abcdefghijklmnopqrstuvwxyz{|}~
1
Steven Penny