中かっこ拡張を使用するコマンドと未使用のコマンドをどのように理解できますか?

中かっこ拡張を使用するコマンドと未使用のコマンドをどのように理解できますか?

たとえば、次のように動作します。

$ curl -s -X GET "http://api-int.abc.com/api/{,,,}ukulele/v1/health"

これはまさに私が望む4つのカールコマンドを実行します。

また、ping中かっこ拡張は使用されません。

$ ping {google,yahoo,microsoft}.com
usage: ping [-AaDdfnoQqRrv] [-b boundif] [-c count] [-G sweepmaxsize]

しかし、触れると、次のような結果が発生します。

$ touch .temp/{a,b,c}.txt

3つのファイルを作成します。

これらのコマンドのマニュアルページで、どのコマンドが中括弧拡張を使用できるかをどのように知ることができますか?

ベストアンサー1

最初に理解する必要があるのは、一部のコマンドは複数のパラメータを受け入れますが、一部のコマンドは許可しないことです。touch複数のパラメータが許可されていますが、これは許可されpingていません。ping括弧が複数に拡張され、複数の引数でpingを呼び出す場合はping機能しません。この場合、forループはより良い解決策です。また、中の括弧はcurl特別な場合です(下記参照)。

「中括弧を拡張できるコマンド」に対する答えは、すべてまたは全部です。中括弧拡張は、拡張出力をコマンドに渡す前にシェルによって実行されます。つまり、実行されるコマンドはまったく関係がありません。foo{bar,baz}toの拡張は、foobar foobazコマンドを開始して拡張文字列を引数として渡す前にシェルによって実行されます。

ただし、引用符内では中括弧の拡張は行われません。つまり、andは"{,,,}"両方とも"{a,b,c}"文字列として保持され、拡張されません。

$ echo "{,,,}"
{,,,}
$ echo "{a,b,c}"
{a,b,c}

拡張機能が正しく機能するには、引用符を削除する必要があります。

$ echo {,,,}  ## this expands to a blank string, so this is what is printed

$ echo {a,b,c}
a b c

これはman bash関連セクション(強調項目)に文書化されています。

中括弧の拡張は、他の拡張の前に実行されます。、他の拡張子に固有の文字はすべて結果に保持されます。厳密にテキストです。 Bashは、拡張コンテキストまたは中括弧の間のテキストに構文解析を適用しません。

正しく設定された中かっこ拡張には、引用符で囲まれていないオープンとクローズの中かっこを含める必要があります。、引用符なしの1つ以上のコンマまたは有効なシーケンス表現。

今、混乱した理由は、curl実際には独自のパーサーがあり、中かっこ拡張も処理するためです。これはシェルとは無関係に行われ、以下で説明しますman curl

次のように中括弧内にサブセットを作成して、複数のURLまたはURLの一部を指定できます。

 http://site.{one,two,three}.com

したがって、実際にはそれを使用するコマンドではなく、コマンドを呼び出す前に中括弧内の式を拡張するシェルであるため、すべてのコマンドは中括弧拡張を使用できます。 Curlは似たような機能を持っているので混乱しています。

おすすめ記事