Das ist kein mehrzeiliger Kommentar. #
ist ein einzeiliger Kommentar.
:
(Doppelpunkt) ist überhaupt kein Kommentar, sondern ein in die Shell integrierter Befehl, der im Grunde genommen eine NOP ist , eine Nulloperation, die nichts anderes tut, als true zurückzugeben true
(und daher $?
als Nebeneffekt auf 0 setzt). Da es sich jedoch um einen Befehl handelt, kann er Argumente akzeptieren, und da er seine Argumente ignoriert, verhält er sich in den meisten Fällen oberflächlich wie ein Kommentar. Das Hauptproblem bei diesem Trick ist, dass die Argumente immer noch erweitert werden, was zu einer Vielzahl von unbeabsichtigten Konsequenzen führt. Die Argumente sind weiterhin von Syntaxfehlern betroffen, Umleitungen werden weiterhin ausgeführt, sodass : > file
sie abgeschnitten werden file
, und : $(dangerous command)
Ersetzungen werden weiterhin ausgeführt.
Der am wenigsten überraschende und völlig sichere Weg, Kommentare in Shell-Skripte einzufügen, ist mit #
. Halten Sie sich auch bei mehrzeiligen Kommentaren daran. Versuchen Sie niemals , (ab) :
für Kommentare zu verwenden. Es gibt keinen speziellen mehrzeiligen Kommentarmechanismus in der Shell, der der Schrägstrich-Sternform /* */
in C
ähnlichen Sprachen entspricht.
Der Vollständigkeit halber, aber nicht, weil es eine empfohlene Praxis ist, möchte ich erwähnen, dass es möglich ist, hier-Dokumente zu verwenden, um mehrzeilige "Kommentare" zu machen:
: <<'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"; }