立即对 stdin 的每一行执行一个命令?

立即对 stdin 的每一行执行一个命令?

如何stdin立即对每一行执行一个命令?

例子

(echo abc; sleep 10; echo def;) | ???

xargs工具无法完成工作,因为它直到它看到所有数据(等待 stdout 关闭)。然而,我必须在新行可用时立即执行命令。

答案1

使用 shell 脚本:

long_running_command | while read -r LINE; do
  echo "line is: $LINE"
  command_to_execute "$LINE"
done

相比之下parallel,这不会产生每行约 150 毫秒 + 3..7 毫秒的开销。它还适用于执行多行 bash 命令、重用函数或变量。

这个想法基于@Hennes 的评论,完成并写下答案。向他/她致敬!

答案2

使用 GNU Parallel:

(echo abc; sleep 10; echo def;sleep 10; echo def;)|parallel -uj1

-u需要立即获取输出。如果没有,命令将运行,但输出将稍后打印。

-j1强制运行单个作业槽。省略它将使 GNU Parallel 读取n开始之前的工作,n= 核心数。

相关内容