To nie jest komentarz wieloliniowy. #
to komentarz jednowierszowy.
:
(dwukropek) wcale nie jest komentarzem, ale raczej wbudowaną komendą powłoki, która jest w zasadzie NOP , operacją zerową, która nie robi nic oprócz powrotu true, jak true
(a zatem ustawienie $?
na 0 jako efekt uboczny). Ponieważ jednak jest to polecenie, może akceptować argumenty, a ponieważ ignoruje swoje argumenty, w większości przypadków powierzchownie działa jak komentarz. Głównym problemem związanym z tą kludge jest to, że argumenty są wciąż rozszerzane, co prowadzi do wielu niezamierzonych konsekwencji. Na argumenty nadal mają wpływ błędy składniowe, przekierowania są nadal wykonywane, więc : > file
zostaną obcięte file
, a : $(dangerous command)
podstawienia nadal będą działać.
Najmniej zaskakujący całkowicie bezpieczny sposób wstawiania komentarzy w skryptach powłoki to #
. Trzymaj się tego nawet w przypadku komentarzy wieloliniowych. Nigdy nie próbuj (ab) używać :
do komentowania. Nie ma dedykowanego wieloliniowego mechanizmu komentowania w powłoce, który byłby analogiczny do postaci ukośnej gwiazdki /* */
w C
podobnych językach.
Ze względu na kompletność, ale nie dlatego, że jest to zalecana praktyka, wspomnę, że można użyć dokumentów tutaj do robienia wieloliniowych „komentarzy”:
: <<'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
CommentedOutBlock() { echo "test"; }