Bash
fish
PowerShell
docker
cmd

シェルでインラインコメントを書く方法

なんでインラインコメントを書くの?

長大なワンライナーを書いた際、各シェルコマンドの説明を入れたくなったときに使っています。
ブログやgistに貼り付けるときのような、コピペで動かしたいけどコメントも入れたいという場面で使えるかと思います。(単純に行末コメントだと改行できないので不便)

また、Dockerfileを書く際にもよく使っています。Dockerfileでは、イメージのレイヤーが増えすぎないように長大なRUNコマンドを書いてしまうことが多く、コメントを入れないとわけがわからなくなりがちです。しかし、下記のような形でDockerfileのコメントをRUNコマンドの途中で書くのは非推奨なので、コメントを入れつつ一つのシェルコマンドとして完結している書き方が要求されます。

RUN echo 'Hello, ' && \
    # ここでコメントは非推奨
    echo 'world!'

インラインコメント

bashで

$ echo "Hello, " && \
> : "this is comment!" && \
> echo "world!"
Hello,
world!

何もしないコマンド:を使って、文字列の引数"this is comment!"をコメントに見立てています。

fishで


$ echo "Hello, "; and \
> set x "this is comment!"; and \
> echo "world!"
Hello,
world!

fishには:がないので、setコマンドで変数を設定し、その値をコメントに見立てています。ちょっと気持ち悪い。

コマンドプロンプトで

> echo Hello, && ^
More? break "this is comment!" && ^
More? echo world!
Hello,
world!

help breakによれば、

DOS システム上で Ctrl + C キーの拡張チェック機能を設定または解除します。

この機能は DOS システムとの互換性を維持するために用意されています。Windows 上
では何の効果もありません。

とのことなので、9x系OSのDOS窓でなければ大丈夫じゃないでしょうか。

powershellで

> echo "Hello, "; `
>> <# this is comment! #> `
>> echo "world!"
Hello,
world!

powershellには場所を選ばない複数行コメントの記法<# ~ #>があるので、そのままインラインコメントとして使えます。

Dockerfile + コマンドプロンプト/powershellで改行する際の注意点

RUNコマンドで改行する際は、末尾のエスケープはシェルに依らず必ずバックスラッシュ\です。RUNコマンド自体の改行が行われ、RUN実行時にはシェルコマンドは1行になり実施されます。おそらくエディタが指摘してくれるとは思いますが念の為。