ブレースの展開:1行で展開する代わりに複数のコマンドを実行しますか?


11

bashでブレース展開を使用すると、次のようになります。

echo {a,b,c}

になる

echo a b c

代わりに、3つの個別のコマンドに展開する方法はありますか?

そのため:

echo {a,b,c}

になるだろう

echo a
echo b
echo c

回答:


12

これは単なる「知りたいから」の質問ですか、それとも本当のユースケースがありますか?それを成し遂げるためにいくつかの体操を行うことができます:

$ eval echo\ {a,b,c}\;
a
b
c

しかし、この種の難読化コマンドをシステムスクリプトに入れている人を追い詰めていました。

代わりに明確にするために行ってみませんか:

$ for X in {a,b,c}; do echo $X; done

あなたは何をしようとしているのかを常に理解できるように、丸ごと移動していくつかの改行を入れて少しインデントすることさえできます。


4
@peth-これは簡単な例だと思います。リストのように単純なものであれば、その通りです。それがもっと似file-{r,b,g}{m,n,o}{x,y.z}.fooている場合は、27個すべての値を列挙するよりも短い形式を使用する方が適切です。
unpythonic

@peth-フォローアップの良い質問だと思いました。
-unpythonic

長い間これを知りたかった、ありがとう!:)
Sirex

1
まあ、ユースケースは、(たとえば)複数のファイルを受け入れないプログラムであるため、展開が機能しません。したがって、プログラムを複数回実行するだけで簡単にできると便利です。これはfor機能しますが、それでもタイピングが多くなります:P
houbysoft

複数のgitブランチをクリーンアップするために使用しeval git branch -d \{ branch-a, branch-b }\;
キット

3

Mark Mannの選択された答えに基づいて、この例をさらに導き出すことができました。

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

それが示しているのは、行内で複数のブレース展開を使用している場合、マークの元の例はすべてのバリエーションを個別に印刷したことです。代わりに、私は彼の答えを使用して複数のファイルを移動/名前変更したかったのです。出力フォーマット一致することを確実にするためにmv、通常は(期待するmv oldfilename newfilename)、私はそれまでに評価されないように、ブレース展開の第二の発生を免れた後に最初のevalコマンドを実行していました。

上記の出力が期待どおりに表示されたため、次のコマンドを実行できました。

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

マークの元の回答に感謝します。彼の答えが私にできることを好めば、彼の答えに投票してください:-)


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