Performance 按原样处理bash中的一行
假设我有两个bash命令:Performance 按原样处理bash中的一行,performance,bash,shell,unix,pipe,Performance,Bash,Shell,Unix,Pipe,假设我有两个bash命令: $ A apple pear lemon $sudo alive6 -l eth1 -W 0.2 | sed -e 's/Alive: \(.*\) \[ICMP echo-reply\]/\1%eth0/' -e'/Scanned.*/d' -e'//d' A写得非常快,但在“柠檬”之后等待1分钟才能成功终止 我希望每一行都能作为B的输入被单独地、即时地处理。 但我不想等待A终止,而是为每一个快速出现的行调用一个新的B。B然后会在A的输出中添加一些东西,比如:
$ A
apple
pear
lemon
$sudo alive6 -l eth1 -W 0.2 | sed -e 's/Alive: \(.*\) \[ICMP echo-reply\]/\1%eth0/' -e'/Scanned.*/d' -e'//d'
A写得非常快,但在“柠檬”之后等待1分钟才能成功终止
我希望每一行都能作为B的输入被单独地、即时地处理。
但我不想等待A终止,而是为每一个快速出现的行调用一个新的B。B然后会在A的输出中添加一些东西,比如:
$ A <for every line appearing> B
1 apple
1 pear
1 banana
即时响应,而
$sudo alive6 -l eth1 -W 0.2 | sed -e 's/Alive: \(.*\) \[ICMP echo-reply\]/\1%eth0/' -e'/Scanned.*/d' -e'//d' | while read l; do echo $l; done
似乎在等待alive6完成
A | while read -r l; do B &; done
B
在后台运行,以满足以下要求:作为B的输入单独处理的行,并且立即使用unbuffer
禁用A
的行缓冲
$ unbuffer A <for every line appearing> B
$unbuffer A B
在Bash中:
while read -r -u 9 line || [ -n "$line" ]
do
B "$line"
done 9< <(A)
读取时-r-u9行| |[-n“$line”]
做
B“$行”
完成9<@icedwater:只有安装了bash,bash脚本才会起作用。是的,但在系统上找到bash
的可能性要大于unbuffer
。这是一件很有用的事情,我正在将它添加到我的收藏夹中。顺便说一句,我猜你没有办法修改A
的行为?如果B
读取标准输入,你需要。你为什么要将B
作为背景?@l0b0 background是我如何处理“作为B的输入单独且立即处理的行”需求。“立即”与“异步”不同。此解决方案最终将使用B
的执行时间来洗牌行。有趣的是,这并没有使它更快。我实际上已经把sed作为B-command了。一个简单的例子,如ls-l&&sleep3 | sed's/*/&/'| whilereadl;不要重复$l;不过,完成了就行了。