Itu bukan komentar multi-baris. #
adalah komentar satu baris.
:
(titik dua) bukan komentar sama sekali, melainkan perintah built-in shell yang pada dasarnya adalah NOP , operasi null yang tidak melakukan apa-apa kecuali mengembalikan true, seperti true
(dan dengan demikian menetapkan $?
ke 0 sebagai efek samping). Namun karena itu adalah perintah, ia dapat menerima argumen, dan karena mengabaikan argumennya, dalam kebanyakan kasus ia bertindak secara dangkal seperti komentar. Masalah utama dengan lumpur ini adalah argumen masih diperluas, yang mengarah ke sejumlah konsekuensi yang tidak diinginkan. Argumen masih dipengaruhi oleh kesalahan sintaksis, pengalihan masih dilakukan sehingga : > file
akan terpotong file
, dan : $(dangerous command)
substitusi akan tetap berjalan.
Cara yang paling tidak mengejutkan yang sepenuhnya aman untuk memasukkan komentar dalam skrip shell adalah dengan #
. Tetap berpegang pada itu bahkan untuk komentar multi-line. Jangan pernah mencoba (ab) menggunakan :
komentar. Tidak ada mekanisme komentar multisaluran khusus di shell yang analog dengan /* */
bentuk bintang-slash dalam C
bahasa yang mirip.
Demi kelengkapan, tetapi bukan karena itu adalah praktik yang disarankan, saya akan menyebutkan bahwa dimungkinkan untuk menggunakan dokumen-dokumen di sini untuk melakukan "komentar" multi-baris:
: <<'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"; }