为什么在这种情况下大括号中的参数不会扩展?

为什么在这种情况下大括号中的参数不会扩展?

例如,我想将一些文件名放在大括号内进行扩展,如下所示:

$ 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 中对其获取的参数执行一些转换,因此最好避免任意输入)。

相关内容