如何在xargs执行的每条命令后添加sleep命令?
如何用xargs实现每条命令执行后sleep?
我有如下bash脚本,通过customListCommand列出条目后,用xargs逐个执行echo:
customListCommand | xargs -P 10 -n1 echo
当customListCommand输出:
a b c
当前等价执行:
echo a echo b echo c
我希望调整为每个echo执行后都运行sleep 1,即执行流程变为:
echo a sleep 1 echo b sleep 1 echo c sleep 1
请问能否通过xargs实现?我推测在末尾额外添加管道无法实现,因为这可能会在所有echo执行完成后才执行一次sleep。
解决方案
当然可以实现,核心是让xargs每次调用包含echo和sleep的shell命令片段,而非单独执行echo。
1. 串行执行(匹配示例的顺序逻辑)
如果不需要并行执行(按顺序处理每个条目,执行完echo+sleep再处理下一个),可以用bash -c打包两个命令:
customListCommand | xargs -n1 bash -c 'echo "$1"; sleep 1' _
bash -c 'echo "$1"; sleep 1'定义了要执行的命令序列,$1会接收xargs传递的每个条目- 末尾的
_是占位符,用来填充bash的$0参数(bash -c的第一个参数是脚本名,第二个才是$1) - 这里去掉
-P10是因为串行执行更符合你示例的顺序需求,若保留-P10会变成并行执行,无法保证条目处理顺序。
2. 保留并行执行
如果仍需要同时运行多个进程(比如最多10个进程同时处理条目),可以保留-P10参数:
customListCommand | xargs -P10 -n1 bash -c 'echo "$1"; sleep 1' _
这种情况下,条目可能会乱序输出,但每个条目对应的echo执行后都会sleep 1秒。
你之前的推测没错:在末尾添加管道确实只能执行一次sleep,因为管道会等待前序所有命令执行完毕后才触发后续命令,无法实现每条命令后单独sleep。
内容的提问来源于stack exchange,提问作者Ymi
相关产品推荐
相关产品推荐

