大括号扩展:运行多个命令,而不是一行扩展?


11

当您在bash中使用括号扩展时,类似

echo {a,b,c}

变成

echo a b c

有没有一种方法可以将其扩展为3个单独的命令,而是每个扩展一个?

以便:

echo {a,b,c}

会成为

echo a
echo b
echo c

Answers:


12

这仅仅是一个“因为我想知道”的问题,还是有一个真正的用例?我们可以通过一些体操来做到:

$ eval echo\ {a,b,c}\;
a
b
c

但是我会追查那些将这些混淆命令放入我们的系统脚本中的人。

为什么不进行澄清:

$ for X in {a,b,c}; do echo $X; done

您甚至可以全力以赴,并添加一些换行符并对其进行缩进,以便始终能够了解您要执行的操作。


4
@peth-我假设这是一个简化的示例。如果确实像列表一样简单,那么您是对的。如果更像是这样,file-{r,b,g}{m,n,o}{x,y.z}.foo则使用简短形式比枚举所有27个值更好。
2011年

@peth-我认为这是一个很好的后续问题。
2011年

我很想知道这一点,谢谢!:)
Sirex

1
嗯,用例是不接受多个文件(例如)的程序,因此无法进行扩展。因此,很容易能够多次运行该程序会很好。的for作品,但它仍然是更多的输入:P
houbysoft 2011年

我用它来清理多个git分支:eval git branch -d \{ branch-a, branch-b }\;
套件

3

根据马克·曼(Mark Mann)的选择答案,我能够进一步得出此示例,该示例非常有用:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

所显示的是,当您在一行中使用多次出现的括号扩展时,Mark的原始示例将单独打印每个变体。相反,我想用他的答案来移动/重命名多个文件。为了确保输出与mv通常期望的格式(mv oldfilename newfilename)相匹配,我避免了第二次出现大括号扩展,因此直到执行初始命令后才对它进行评估eval

由于上面的输出按预期显示,因此我能够运行以下命令:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

非常感谢Mark的原始回答。如果您喜欢他的回答允许我做的话,请投票给他回答:-)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.