首页 > 解决方案 > 将输出传送到另一个延迟命令时如何暂停主命令

问题描述

我有两个自定义脚本来实现它们自己的任务,一个用于输出一些 URL(伪装成cat下面的命令),另一个用于接收 URL 以通过网络请求解析它(伪装成sleep下面的命令)。

这是原型:

情况1:

cat urls.txt | xargs -I{} sleep 1 && echo "END: {}"

输出是END: {}sleep作品。

案例二:

cat urls.txt | xargs -I{} echo "BEGIN: {}" && sleep 1 && echo "END: {}"

输出是

BEGIN: https://www.example.com/1
BEGIN: https://www.example.com/2
BEGIN: https://www.example.com/3
END: {}

但似乎只有sleep1秒。

Q1:我有点困惑,为什么会有这些输出?

Q2:是否有任何解决方案可以为每行输出执行完整的流水线xargs延迟命令?cat

标签: macosshellcommand-linexargs

解决方案


您可以将命令放入单独的脚本中:

工人.sh

#!/bin/bash
echo "BEGIN: $*" && sleep 1 && echo "END: $*"

设置执行权限:

chmod +x worker.sh

并用 xargs 调用它:

cat urls.txt | xargs -I{} ./worker.sh {}

输出

BEGIN: https://www.example.com/1
END: https://www.example.com/1
BEGIN: https://www.example.com/2
END: https://www.example.com/2
BEGIN: https://www.example.com/3
END: https://www.example.com/3

在 BEGIN 和 END 之间,脚本休眠一秒钟。


推荐阅读