Bashのインラインコメント?


142

1行のコマンドで1つのフラグをコメント化できるようにしたいのですが。Bashはfrom # till end-of-lineコメントしているようです。私は次のようなトリックを見ています:

ls -l $([ ] && -F is turned off) -a /etc

醜いですが、何もないよりはましです。もっと良い方法はありますか?

以下は動作するようですが、移植可能かどうかはわかりません:

ls -l `# -F is turned off` -a /etc

#commentトリックはここにも言及されていますstackoverflow.com/questions/9522631/...
ユハPalomäki

1
@JuhaPalomäkiによって言及されたリンクに続いて${IFS#comment}、コメントに@pjhによって導入されたこの素晴らしいトリックがあります。サブシェルは呼び出されません。
アレクシス2015

回答:


110

私の好みは:

Bashスクリプトでのコメント

これには多少のオーバーヘッドがありますが、技術的にはあなたの質問に答えます

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

特にパイプラインについては、オーバーヘッドのないよりクリーンなソリューションがあります

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

複数行コマンドの行コメントを配置する方法


3
バッククォートを使用する必要があることに注意してください$(#comment)
funroll 2016

1
一部のバージョンでは)、コメント自体の一部として考慮されます。bashの課題のほとんどは、古いバージョンとのレトロな互換性によるものであり、1つの一般的な戦略は、可能な限り最も古いソリューションを使用することです。
Rafareino 2018年

2
これは実際のコメントではありませんtrue && `# comment` && true。有効な式です。実際のコメントは次のようなものを生成します:syntax error near unexpected token && '`
Sebastian Wagner

あなたは正しい@sebastianwagnerです。また、OR短絡などで失敗することにも注意してください。ただし、それほど複雑にすることなく、できる限り良いことだと思います。私にとってそれはよりよい言語が必要であることを示すしるしですが、それを文書化するためのそのような「コメント」ですでに構築されたコードを維持することは素晴らしいことです。
Rafareino 2018

助けてくれてありがとう!
xiarnousx 2018年

58

行をコピーして元のバージョンをコメント化するのが最も簡単です(そして最も読みやすい)。

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

明確にするために賛成票を投じます。これが最初のオプションではない理由がわかりません。
David Tabernero M.

しかし、それはインラインではありませんか?私はこれがbashでサポートされていないことを行う必要があることが別の方法を見つける原因になると言うのは公正だと思います
ThorSummoner '26

25

$(: ...) 少し見苦しくないですが、それでも良くありません。


2
この構文では、サブシェルを起動しています。コードの動作をまったく変更せずに、コメントを追加して編集可能性を向上させますが、このサブシェルを起動/終了する時間により、コードが遅くなります(控えめに言っても)、新しい行の先頭にコロンだけを使用しないのはなぜですか?
Rafareino、2014年

1
$ {IFS#...}を使用すると、サブシェルは呼び出されません。
アレクシス

3
@Rafareino:ええ。しかし真剣に、95%のアプリケーションでは、このオーバーヘッドはまったく問題になりません。重要な場合の多くでは、そもそもBashよりも高速な言語を使用することをお勧めします。
leftaroundabout

...問題は、$(: ...)構文が実際にコメントの埋め込みを許可していないように見えることです。echo "foo" `# comment` "bar"コメントは2番目のバックティックで終了しますが、同等のものecho "foo" $(: # comment) "bar"はの後ろで何も解析しません#
leftaroundabout

4

それを変数に格納するのはどうですか?

#extraargs=-F
ls -l $extraargs -a /etc

4

これが、パイプで連結された複数のコマンド間のインラインコメントに対する私の解決策です。

コメントなしのコードの例:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

パイプコメントの解決策(ヘルパー関数を使用):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

または、必要に応じて、ヘルパー関数を使用しない同じソリューションを以下に示しますが、少し面倒です。

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

7
余談ですが、パイプ文字を前の行の終わりに移動すると、不快なバックスラッシュ-改行を取り除くことができます。
tripleee 2016

3

ほとんどのコマンドでは、引数を任意の順序で使用できます。コメント付きのフラグを行末に移動するだけです。

ls -l -a /etc # -F is turned off

次に、オンに戻すには、コメントを外してテキストを削除します。

ls -l -a /etc -F

1
くそー、私#はコマンドの後に単一の空白なしで追加しました。ありがとうございました!
18


1

のようなコマンドの一部を無効にするために、パス上にa && b空のスクリプトxを作成しただけなので、次のようなことができます。

mvn install && runProject

構築する必要があるとき

x mvn install && runProject

そうでない場合(を使用Ctrl + ACtrl + Eて、最初と最後に移動します)。

コメントで述べたように、これを行う別の方法は、次の:代わりにBash組み込みですx

$  : Hello world, how are you? && echo "Fine."
Fine.

2
そのような組み込みは既に存在します:次の:ように:string; of; commands; : disabled; enabled;
xenithorb

さらに良い:)ありがとう
OndraŽižka2018年

-1

コメントを作成する価値がある場合は、おそらく行の最後に置くことも、単独で行に入れることもできます。どの言語でも、コメントの前後にコードを含む行内コメントが必要になることはめったにありません。

ああ、例外が1つあります。それは、私が通常使用するSQLの方言であり、「{comments}」を使用します。時々、私は書きます:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

しかし、それでも一続きです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.