複数行のシェルスクリプトコメント-これはどのように機能しますか?


92

最近、私はこれまで見たことのない複数行のコメントタイプにつまずきました。スクリプトの例を次に示します。

echo a
#
: aaa 
: ddd 
#
echo b

これは機能しているように見えvimますが、構文を強調することさえできます。このコメントのスタイルは何と呼ばれ、それに関する詳細情報を見つけるにはどうすればよいですか?


1
代わりにコードを関数にラップしてコメントアウトするとどうなりますか?CommentedOutBlock() { echo "test"; }
ブクシー

回答:


135

これは複数行のコメントではありません。 #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

29
+1は、<<行に単一引用符を保持するために非常に重要です。これにより、置換と展開がオフになります。
グレンジャックマン

4
補足説明として、:コメントにすべきものでシェルスクリプトをいっぱいにすると、RAM / CPUが余分に消費されます。デスクトップ上の単純なものには関係ありませんが、 1秒間に数百または数千回実行されるものであれば、何もしません
バハマ

3
@bahamat:1秒間に数百または数千回何かを実行する場合、シェルでそれを書かないことを望みます... = /
7heo.tk

1
複数行のテキストにnullユーティリティを使用すると便利な場合があります。でコメントを開始: <<=cutすると、シェルスクリプトでPOD記述できます。詳細については、この例を参照してください。これにより、を使用できるようになりますperldoc script.sh。ただし、この回答に示されている複数行のコメントは、コメントブロック(各行がで始まる# )であることは間違いありません。
基本

:ここで(でもdynaimcスクリプトの生成を含む)、コメントや他の興味深いユースケースの両方に使用ヒアドキュメント上の素敵な議論、だtldp.org/LDP/abs/html/here-docs.html#EX71C
bguiz

28

コメントのスタイルではありません。:組み込みのコマンドは、絶対に何もしません。ここでコメントするために悪用されています。

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

25

初期のシェルでは、コメントを作成する唯一の方法はコロンでした。

ただし、他のコマンドが解析されるのとまったく同じ方法で行が解析され、副作用が生じる可能性があるため、これは本当のコメントではありません。例えば:

: ${a:=x} # assigns the value 'x' to the variable, 'a'

: $(command) # executes 'command'

(コロンは、これらの副作用を呼び出すためだけに使用されることもありますが、コメントとしては使用されません。)

コロンを使用してスクリプトのセクションをコメントアウトすると便利な場合があります。

: '
while [ "$n" -ne "$x" ]
do
  : whatever
done
'

これは#、特にコメントアウトが一時的なものである場合に、各行の前にを付けるよりも時間を節約できます。


2
その一重引用符によるコメント方法は、それ自体が一重引用符を使用するスクリプトのセクションでは機能しません。また、引用符を必要な範囲で使用している場合、スクリプト全体に正規の単一引用符が散在していることになります。行単位のコメントをブロックできる適切なエディターを使用する方がはるかに簡単です。
jw013

引用セクションに一重引用符がない場合にのみ機能することは非常に正しいです。ただし、スクリプトには多くの単一引用符を付ける必要はありません。いくつかのスクリプトを調べてみると、それらは比較的まばらであり、多くは二重引用符で置き換えることができます。
クリスFAジョンソン

一重引用符または二重引用符の選択は、スクリプトのテキスト自体が有効な一重引用符の文字列であるかどうかという些細で無関係な問題にほとんど影響されません。単一引用符は展開を防ぐために使用され、二重引用符は特定の展開を許可し、追加の解析を必要とします。これは、どちらを使用するかを決定するための実際の基準です。
jw013

これは、これを行うための最もシックな方法です。ドキュメントの小さなブロックに最適です。私はそれよりも好きで/* */、始めてはいけません<!-- -->
アレックスグレー

1

コメントがスクリプトの最後にある場合、次のようにできます。

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.