Max*_*xim 5 command-line bash brace-expansion
例如,我想将一些文件名放在大括号内进行扩展,如下所示:
$ 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}
Run Code Online (Sandbox Code Playgroud)
我的问题为什么大括号扩展在这里不起作用?我希望它按以下方式工作:
$ echo foo/bar/{blue_texture,blue_waves,green_light}
foo/bar/blue_texture foo/bar/blue_waves foo/bar/green_light
Run Code Online (Sandbox Code Playgroud)
这不起作用的原因是因为在命令替换之前bash
执行大括号扩展(Bash 参考手册有一些关于此的信息)。直到大括号扩展已经发生之后才执行替换。
您可以这样做的唯一方法是使用eval
,但在这种情况下不要这样做,因为您将允许任意命令执行。
相反,您必须寻求其他方法。这应该会产生您寻求的输出:
for file in *; do
printf '%s ' "foo/bar/$file"
done; echo
Run Code Online (Sandbox Code Playgroud)