たとえば、次のように中かっこ内にいくつかのファイル名を拡張したいとします。
$ 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
ほとんどのシェルでは、取得した引数に対していくつかの変換が行われるため、任意の入力を避けるのが最善です。)