如何使用大括号扩展(或其他简单方法)重复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
答案 0 :(得分:1)
以正确和安全的方式执行此操作并不像您所希望的那样简洁:
for arg in b c; do cp a "$arg"; done
引号很重要 - 否则,名为filename with a space
的文件将转换为四个单独的参数filename
,with
,a
和space
。 (如果你真的只是处理b
和c
,那不是问题,但是建立一种习惯会让你陷入热水之后并不是一种好习惯。
你的问题和评论假定使用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
。