Bash Xargs Sleep(多个命令行参数)

3

好的,我有以下脚本可以更新Route43 DNS条目。不幸的是,您每秒钟所能发出的调用次数有限制,因此我需要让最终的Xargs命令在每次迭代之间睡眠约一秒钟。

我尝试了一些方法,比如“{../cli53 blah; sleep 10; }”,但我似乎无法让它起作用。请问有什么建议吗?

#!/bin/bash

set root='dirname $0'
ec2-describe-instances -O ******* -W ******* --region eu-west-1 |
perl -ne '/^INSTANCE\s+(i-\S+).*?(\S+\.amazonaws\.com)/
and do { $dns = $2; print "$1 $dns\n" }; /^TAG.+\sName\s+(\S+)/
and print "$1 $dns\n"' |
perl -ane 'print "$F[0] CNAME $F[1] --replace\n"' |
grep -v 'i-' | xargs --verbose -n 4 /usr/local/bin/cli53 rrcreate -x 5 contoso.com

编辑:感谢Etan提供的答案。以下是我的解决方案,供其他需要的人参考:

我还得在xargs语句中加入-I %variable%开关,以确保输入的信息作为参数传递给cli53,但现在看起来一切都很顺利。

#!/bin/bash

set root='dirname $0'
ec2-describe-instances -O ******* -W ******* --region eu-west-1 |
perl -ne '/^INSTANCE\s+(i-\S+).*?(\S+\.amazonaws\.com)/
and do { $dns = $2; print "$1 $dns\n" }; /^TAG.+\sName\s+(\S+)/
and print "$1 $dns\n"' |
perl -ane 'print "$F[0] CNAME $F[1] --replace\n"' |
grep -v '^i-' |
xargs --verbose -n 4 -I myvar /bin/sh -c '{ /usr/local/bin/cli53 rrcreate -x 5 contoso.com 'myvar'; sleep 1; printf "\n\n"; }'

那些“内部”的单引号不像你期望的那样工作。它们结束和开始外部的单引号字符串,使myvar未被引用。它们并没有对外部单引号字符串中myvar扩展进行单引号处理。请改用双引号来包裹myvar。或者,可以使用脚本的位置参数。 - Etan Reisner
1个回答

3

最简单的解决方案是将cli53sleep调用放入脚本中,并使用xargs执行该脚本。

如果您不想这样做,您应该能够通过以下方式实现您尝试做的事情:

... | xargs ... /bin/sh -c '{ /usr/local/bin/cli53 ... "$@"; sleep 10; }' -

我想使用后者,但是当我将{cli53; sleep 10;}命令放入其中时,它不起作用。请给我一个确切的示例,说明我应该如何将sleep集成到xargs行中?编辑:哦,我想我一直缺少了“/ bin / sh -c”-我现在无法测试,直到明天早上。 - Skavenger0
是的,你需要/bin/bash -c这部分,因为xargs只执行单个命令。在这种情况下,你让它执行单个/bin/sh(或者如果需要的话,是/bin/bash),而这个调用恰好包含一个shell脚本作为参数。 - Etan Reisner
请看我的评论,了解为什么你的解决方案不完全正确,以及我在这里的编辑提供更正确的方法。 - Etan Reisner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接