如何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= 核心数。