最近、私は以前に見たことのない種類の複数行コメントを偶然発見しました。以下はサンプルスクリプトです。
echo a
#
: aaa
: ddd
#
echo b
これはうまくいくようです。構文vim
の強調も動作します。このようなコメントスタイルを何と呼びますか?これに関する追加情報をどのように見つけることができますか?
答え1
これは複数行のコメントではありません。 #
一行コメントです。
:
(コロン)まったくコメントではなく、シェル組み込みコマンドです。いいえ、何もせずにtrueを返すnull演算ですtrue
(したがって$?
副作用として0に設定されます)。しかし、コマンドなので引数を受け入れることができ、引数を無視するので、ほとんどの場合、表面的にはコメントのように動作します。今回のパッチワークの主な問題点は、議論が拡大し続け、意図しない結果が多く出てくることです。パラメータは依然として構文エラーの影響を受け、リダイレクトは引き続き実行されるため切り捨てられ、代替エントリは引き続き: > file
実行file
さ: $(dangerous command)
れます。
シェルスクリプトにコメントを挿入する最も驚くほど完全に安全な方法は、#
複数行のコメントにもこれを使用することです。 いいえコメントを(ab)お試しください:
。/* */
同様の言語のスラッシュ - アスタリスク形式に似た専用の複数行コメントメカニズムがシェルにありません。C
完全性のためにこれが推奨される方法ではないので、次のものを使用できると述べます。ここのドキュメント複数行の「コメント」を作成します。
: <<'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
答え2
これはレビュースタイルではありません。組み込み:
コマンドはまったく何もしません。ここでは注釈のために乱用されました。
$ help :
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
答え3
初期シェルでは、コメントを書く唯一の方法はコロンでした。
ただし、この行は他のコマンドとまったく同じ方法で解析され、副作用がある可能性があるため、これは実際のコメントではありません。たとえば、
: ${a:=x} # assigns the value 'x' to the variable, 'a'
: $(command) # executes 'command'
(コロンはこれらのサイドエフェクトを呼び出す目的でのみ使用されますが、そのときはコメントとしては使用されません。)
時には、コロンを使用してスクリプトの一部をコメントアウトするのが便利な場合があります。
: '
while [ "$n" -ne "$x" ]
do
: whatever
done
'
これにより、各行にプレフィックスを付けるよりも時間を節約できます#
。特に注釈が一時的な場合であればさらにそうです。
答え4
あなたのコメントがスクリプトの最後にある場合は、次のことができます。
#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~