
長い AND/OR ステートメントを作成してフォーマットするコードがよくあります。例:
# Get wifi router gateway
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
| cut -d' ' -f5 \
| tr --delete \;)
上記のようなコマンドの 1 つのステップが複雑になることがあります。そのため、コメントを付けたくなります。
たとえば、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
dash
これは Bashなどで動作するようです:
#!/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
またzsh
、bashをエミュレートできる(単にbashまたはrunと呼ぶemulate bash
)は、実際には複数行コマンド!
bindkey -e
またはを実行しbindkey "^[^M" self-insert-unmeta
、M-Return を押すことで新しい行に移動できます。
1 つの履歴エントリとして保存されます。予想どおり、矢印キーを使用して移動できます。エントリが切り替わるのは、最上行または最下行で上または下に移動した場合のみです。