複数行のコマンドチェーンに注釈を付けますか?

複数行のコマンドチェーンに注釈を付けますか?

私はしばしば長いAND / ORステートメントを書いてコードをフォーマットします。たとえば、

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

時には、上記のコマンドの個々のステップが複雑になることがあります。だからついにコメントしたいと思いました。

たとえば、cutコマンドが実際よりも複雑であるとします。だから私は次のことをしたいと思います:

  # Get wifi router gateway
  gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            # Here is a note
            | cut -d' ' -f5 \
            | tr --delete \;)

これが間違った構文であることを知っています。

しかし、他の人が長い指揮システムについてコメントする戦略を持っているかどうか疑問に思います。

答え1

これはBashdashなどで動作するようです。

#!/bin/sh
seq 20 |       # make a long list
grep '[234]'   # mut only take part of it

パイプに似ているか、&&代わりに。||$( ... )

答え2

コマンドの構文が無効になる唯一の理由は、各行で不必要に改行文字をエスケープしていることです。

注文、

gateway=$(cat $leases \
            | grep -A 5 -m 1 $wifi \
            | grep option\ routers \
            | cut -d' ' -f5 \
            | tr --delete \;)

そして

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  | cut -d' ' -f5 | tr --delete \;)

つまり、シェルの観点からは、まったく複数行のコマンドではありません。

前にコメントを挿入すると、コマンドの置き換えは終了しcutません(最後のコメントを推奨))。

gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers  # Here is a note | cut -d' ' -f5 | tr --delete \;)

ただし、改行文字をエスケープする必要はありません。以下は完全に有効なコードです。

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            | cut -d' ' -f5
            | tr --delete \;)

ここに説明を挿入してください。

gateway=$(cat $leases
            | grep -A 5 -m 1 $wifi
            | grep option\ routers
            # Here is a note
            | cut -d' ' -f5
            | tr --delete \;)

これは、パイプの各部分の後に 1 つ以上の改行文字が続く可能性があるため、シェルのパーサーがコメントを無視するので、これは良い方法です。


実際の状況を見るパスワード、これはより安全で移植性の高いバリアントです(grepまだ標準外の拡張を使用する必要がある初期バリエーションを除く)。

gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
            | grep -F 'option routers'
            # Here is a note
            | cut -d ' ' -f 5
            | tr -d ';' )

答え3

また、zshbashをエミュレートすることができます(bashまたはrunと呼ぶだけですemulate bash)、実際にサポートします。複数行コマンド

bindkey -eorを実行してbindkey "^[^M" self-insert-unmetaからM-Returnを押すと、新しい行に移動できます。

履歴として保存され、期待どおりに矢印キーを使用して移動できます。上/下の行から上/下に移動したときにのみ項目を切り替えます。

関連情報