大括号扩展命令无法识别

时间:2014-09-23 15:46:09

标签: bash shell backticks brace-expansion

如何使用大括号扩展(或其他简单方法)重复shell命令,为命令的每次迭代调整某些参数?这是我想要做的一个简单示例(但有更长的命令):     cp a b; cp a c;

显然,如果我将其输入终端,则有效。但我希望能够以更紧凑的方式生成它。我试图使用bash大括号扩展,但它给了我一个命令not found error:

~/test $ ls
a
~/test $ cp\ a\ {b,c}\;
cp a b;: command not found
~/test $ 

使用反引号也行不通。

~/test $ `cp\ a\ {b,c}\;`
cp a b;: command not found

1 个答案:

答案 0 :(得分:1)

以正确和安全的方式执行此操作并不像您所希望的那样简洁:

for arg in b c; do cp a "$arg"; done

引号很重要 - 否则,名为filename with a space的文件将转换为四个单独的参数filenamewithaspace 。 (如果你真的只是处理bc,那不是问题,但是建立一种习惯会让你陷入热水之后并不是一种好习惯。


你的问题和评论假定使用eval来处理大括号扩展的结果,但这有点邪恶:

eval "cp a "{b,c}";"

这个问题在于,虽然它非常适用于非常简单的参数,但它的行为会出现令人惊讶和意想不到的方式,其参数并不那么简单(特别是包含shell语法的文件名)。因此,这是非常糟糕的做法。


关于反叛 -

`cp a b c`

完全相同
cp a b c

...除了它还从cp的stdout读取,将cp的输出替换为到结果命令中,然后也运行该命令。 / p>

所以,

echo `cp a b c`

首先运行cp a b c,读取输出 - 这是空的,因为即使出现错误,它也会写入stderr,而不是stdout,然后运行

echo

......没有参数。如果cp 向其stdout发出了一些内容,那么该字符串将被解析为参数,并且这些参数将被传递给echo