1

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

显然,如果我将它输入到终端中,那将有效。但我希望能够以更紧凑的方式生成它。我尝试使用 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
4

1 回答 1

1

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

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

引号很重要——否则,一个名为的文件filename with a space将被转换为四个单独的参数,filename,和. (如果您实际上只是在处理and ,那不是问题,但是养成让您以后陷入困境的习惯并不是一个好习惯)。withaspacebc


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

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

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


关于反引号——

`cp a b c`

完全一样

cp a b c

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

所以,

echo `cp a b c`

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

echo

...没有争论。如果 cp确实向其标准输出发出了某些内容,那么该字符串将被解析为参数,并且这些参数将被传递给echo.

于 2014-09-23T23:44:13.153 回答