この場合、中かっこ内のパラメータが拡張されないのはなぜですか?

この場合、中かっこ内のパラメータが拡張されないのはなぜですか?

たとえば、次のように中かっこ内にいくつかのファイル名を拡張したいとします。

$ ls
blue_texture  blue_waves  green_light
$ ls -m | tr -d ' \n'
blue_texture,blue_waves,green_light 
$ echo foo/bar/{`ls -m | tr -d ' \n'`}
foo/bar/{blue_texture,blue_waves,green_light}

サポート拡張がここで機能しないのはなぜですか?私はこれが次のように機能することを期待しています:

$ echo foo/bar/{blue_texture,blue_waves,green_light}
foo/bar/blue_texture foo/bar/blue_waves foo/bar/green_light

答え1

これがうまくいかないのは、bash支柱の拡張が行われるからです。今後コマンドの置き換え(バッシュリファレンスマニュアルこれについての情報があります)。支柱が拡張されるまで交換は行われません。

これを行う唯一の方法はを使用することですeval欲しくないこの場合、ランダムなコマンドの実行が許可されます。

代わりに別の方法を見つける必要があります。これにより、目的の結果が生成されます。

for file in *; do
    printf '%s ' "foo/bar/$file"
done; echo

答え2

zshを使う:

files=(*)
echo foo/bar/$^l

${^array}中括弧拡張スタイルの配列拡張を開きます。)

または:

echo ./*(:s:.:foo/bar:)

ファイル名拡張子に過去の拡張子スタイル置換を適用します。

どんな殻でも

printf 'foo/bar/%s\n' *

または:

set -- *
for i do
  set -- "$@" "foo/bar/$i"
  shift
done
echo "$@"

echoほとんどのシェルでは、取得した引数に対していくつかの変換が行われるため、任意の入力を避けるのが最善です。)

関連情報