最近、私はこれまで見たことのない複数行のコメントタイプにつまずきました。スクリプトの例を次に示します。
echo a
#
: aaa
: ddd
#
echo b
これは機能しているように見えvim
ますが、構文を強調することさえできます。このコメントのスタイルは何と呼ばれ、それに関する詳細情報を見つけるにはどうすればよいですか?
最近、私はこれまで見たことのない複数行のコメントタイプにつまずきました。スクリプトの例を次に示します。
echo a
#
: aaa
: ddd
#
echo b
これは機能しているように見えvim
ますが、構文を強調することさえできます。このコメントのスタイルは何と呼ばれ、それに関する詳細情報を見つけるにはどうすればよいですか?
回答:
これは複数行のコメントではありません。 #
1行のコメントです。
:
(コロン)はまったくコメントではなく、基本的にNOPであるシェル組み込みコマンドであり、trueを返す以外は何もしないtrue
(したがって$?
、副作用として0に設定する)null操作です。ただし、コマンドであるため、引数を受け入れることができ、引数を無視するため、ほとんどの場合、表面的にはコメントのように動作します。このクラッジの主な問題は、引数がまだ拡張されており、意図しない結果をもたらすことです。引数は依然として構文エラーの影響を受け、リダイレクトは実行されるため: > file
切り捨てられfile
、: $(dangerous command)
置換は引き続き実行されます。
シェルスクリプトにコメントを挿入する最も驚くべき完全に安全な方法は、#
です。複数行コメントの場合でもそれを守ります。 コメントを(乱用)しようとしないでください:
。シェルには/* */
、C
-like言語のスラッシュスター形式に類似した専用の複数行コメントメカニズムはありません。
完全を期すためですが、推奨されるプラクティスではありませんが、ヒアドキュメントを使用して複数行の「コメント」を行うことができることに言及します。
: <<'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
<<
行に単一引用符を保持するために非常に重要です。これにより、置換と展開がオフになります。
: <<=cut
すると、シェルスクリプトでPODを記述できます。詳細については、この例を参照してください。これにより、を使用できるようになりますperldoc script.sh
。ただし、この回答に示されている複数行のコメントは、コメントブロック(各行がで始まる#
)であることは間違いありません。
コメントのスタイルではありません。:
組み込みのコマンドは、絶対に何もしません。ここでコメントするために悪用されています。
$ help :
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
初期のシェルでは、コメントを作成する唯一の方法はコロンでした。
ただし、他のコマンドが解析されるのとまったく同じ方法で行が解析され、副作用が生じる可能性があるため、これは本当のコメントではありません。例えば:
: ${a:=x} # assigns the value 'x' to the variable, 'a'
: $(command) # executes 'command'
(コロンは、これらの副作用を呼び出すためだけに使用されることもありますが、コメントとしては使用されません。)
コロンを使用してスクリプトのセクションをコメントアウトすると便利な場合があります。
: '
while [ "$n" -ne "$x" ]
do
: whatever
done
'
これは#
、特にコメントアウトが一時的なものである場合に、各行の前にを付けるよりも時間を節約できます。
/* */
、始めてはいけません<!-- -->
!
CommentedOutBlock() { echo "test"; }