目标和背景
我正在编写一个 bash 脚本(称为foreach_repo
),它应该将传递的参数作为 shell 命令执行,例如:
foreach_repo hg status
应该执行命令hg status
。(它在存储库的复杂嵌套结构上执行此操作,我无法控制此结构,但我需要经常对它们进行批量操作)。
这种类型的命令类似于sudo
其他“高阶”命令;例如sudo hg status
,将依次hg status
以超级用户权限执行。
在内部,我的脚本执行以下操作(给定标准输入上的存储库路径提要,由脚本的另一部分创建 - 与此问题无关):
while read repo do
container="$repo/.."
cd $base/$container
$@
done
Where$@
旨在将传递的参数解释为要在存储库中执行的命令。
执行
这种方法适用于简单的命令,例如
foreach_repo hg status
将正确返回结构中每个存储库的状态列表。然而,更复杂的命令(带有转义符、引号......)被搞砸了。例如,当我尝试
foreach_repo hg commit -m "some message"
我明白了
abort: message: no such file or directory
因为引号被去掉了,实际执行的命令是:
hg commit -m some message
尝试的解决方案
手动转义引号或要传递的整个命令无效, using$*
而不是$@
. 但是,类似的命令sudo
可以处理这种情况,即:
sudo hg commit -m "some message"
实际上(并且正确地)执行
hg commit -m "some message"
我怎样才能完成相同的行为?