【发布时间】:2014-09-23 15:46:09
【问题描述】:
如何使用大括号扩展(或其他简单方法)重复 shell 命令,为命令的每次迭代调整某些参数?这是我想做的一个简单示例(但命令更冗长): cp a b; cp a c;
显然,如果我在终端中输入它就可以了。但我希望能够以更紧凑的方式生成它。我尝试使用 bash 大括号扩展,但它给了我一个找不到命令的错误:
~/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
【问题讨论】:
-
您正在构建一个
cp a b;的字符串。那不是命令。那是一个字符串。尝试输入“cp a b;”在你的外壳上,看看会发生什么。没有eval,您将无法在此处执行您想做的事情。echo b c | xargs cp a应该在这里做你想做的事情,但不知道 真实 的情况是什么,我无法提供更好的解决方案。 -
@etan 好建议。一个更明确的写法是
for f in b c; do cp a $f; done,但这只是风格问题。 -
eval cp\ a\ {b,c}\;似乎有效。一方面,反引号和 $() 和另一方面的 eval 到底有什么区别? -
shell 对输入行的每个单词应用各种类型的扩展,以评估命令的最终参数。当该命令为
eval时,生成的参数将经历整个过程再次,这次将第一个参数作为最终执行的命令。 -
@mike,使用此处给出的反引号读取 cp 命令的标准输出并尝试将该标准输出作为另一个命令本身运行,因此在 cp 将内容发送到标准错误的常见情况下根本没有效果只有标准输出,没有任何东西。
标签: bash shell backticks brace-expansion