例如,我想将一些文件名放在大括号内进行扩展,如下所示:
$ 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
执行大括号扩展前命令替换(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
在大多数 shell 中对其获取的参数执行一些转换,因此最好避免任意输入)。