Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 按原样处理bash中的一行_Performance_Bash_Shell_Unix_Pipe - Fatal编程技术网

Performance 按原样处理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的输出中添加一些东西,比如:

假设我有两个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 <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;不过,完成了就行了。