ネストされた中括弧の拡張とコマンドの置き換え

ネストされた中括弧の拡張とコマンドの置き換え

ディレクトリに名前に1からNまでの数字を含むすべてのファイルが含まれていることを確認する単純なbashスクリプトを作成したいと思います。

# Creating some files for testing
$ cd /tmp/
$ mkdir test
$ touch test/a01x.dat
$ touch test/b02y.dat

# Display dir contents
$ ls test/*{01,02}*
test/a01x.dat  test/b02y.dat

ただし、seq数値を生成するためにコマンドを使用すると、次のような結果が生成されます。

$ ls test/*{$(seq -s , -f "%02g" 1 2)}*
ls: cannot access 'test/*{01,02}*': No such file or directory

単一引用符で囲まれたパスを介してコマンドを実行すると、ワイルドカードが拡張されないため、間違いなくエラーが発生することがわかります。

$ ls 'test/*{01,02}*'

しかし、私はそれらを使用しませんでした。問題は何ですか?

ベストアンサー1

問題は、シェルがコマンドの{...,...}置き換え(部分的に)を実行する$(...)前に中括弧を拡張(処理)することです。したがって、seq拡張後、シェルはそれを再計算せずに{01,02}リテラルとして残します。

evalコマンド置換を実行した後に式を再評価するには、1つを追加する必要があります。

$ eval "ls test/*{$(seq -s , -f "%02g" 1 2)}*"

この場合、最初にコマンド置換を実行して文字列を生成し、シェルからコマンドとして解釈するように要求し、中かっことグローバル拡張を実行しls test/*{01,02}*eval目的のファイルのリストを生成します。

おすすめ記事