シェルスクリプトで複数行コメントアウト

シェルスクリプト Tips、曰く

あくまで筆者の好みでありほぼ完全に主観

と書いてありますが、日常的にシェルスクリプトを書いている人にとって、誰もが共感出来るまとめだと思いました。好みの問題以外の部分については、大体の項目が当てはまると思います。

複数行の一括コメントアウトについて

ページでは、以下のように : コマンド( 何もしない )とヒアドキュメントを利用して複数行コメントを実現していました。なるほどなあ。

: <<'#COMMENT_OUT'
~ (コメントアウトした何らかの処理)
#COMMENT_OUT

ちょっとトリッキーな方法で複数行コメントを実現しているので、後から見た時に何をやっているのか分かりやすいように「COMMENT_OUT」という識別子をつけているようです。
ただ、個人的には明示的にコメントしたいのであれば行コメントを利用した方が明確だし、少々難解になってもいいから(自分が分かればいいや思想)手軽にしたい場合には、ちょっと長すぎる気がしました。まあ、サンプルの為にこの識別子を記載されていたんでしょうが、もっとシンプルにならないかなあと思って以下のようにしてみました。

:<<:
~ (コメントアウトした何らかの処理)
:

うむ。これなら5文字でコメントアウトできるぞっ。実行してみても、ちゃんと「コメントアウト」出来ています。ただ、これには落とし穴、というか注意点があります。

:<<:
echo aaa | \
:
cat

このように、パイプの前半部をぶった切るようなコメントアウトの場合、コメントを解除する際に問題が発生します。

#:<<:
echo aaa | \
:
cat

文字列 “aaa” の受け取り先が、: コマンドとなってしまい、cat の標準入力には何も送られて来ません。
同じような問題はこのコメント方式だけではなく、ページで紹介されているコメント方式でも発生します。

echo aaa | \
:<<'#COMMENT_OUT'
tr a b | \
COMMENT_OUT
cat

コメントアウトした時点で、echo aaa の標準出力は : の標準入力に接続されてしまい、cat コマンドにはパイプが届いていません。

さらに、両者とも : コマンドを利用しているので、コメントアウトを有効にした場合と無効にした場合とでは、直後の $? (直前のコマンドの終了コードの値が入る特殊変数)の内容に影響がありそうです。

シェルスクリプトやパイプの特性を正しく理解した上で使うなら、複数行コメントも大いに役立つと思います。ページでも

この Tips は実践すると突飛な処理になるため非推奨

と、しっかりと明記がしてあります。仕組みを理解しているユーザが、 =pod 用途のように「混み入ったコードでは使わない方が無難」という感覚で使う分であれば、

:<<:
~ (コメントアウトした何らかの処理)
:

でも、手軽でいいなあと思う今日この頃でした。

投稿者:

dyama

佐世保のシステムエンジニアです。詳しいプロフィールやこのブログについてはこちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください