1

假设我有 2 个 bash 命令:

$ A
apple
pear
lemon

A 写得非常快,但在“柠檬”成功终止后等待 1 分钟。

我希望每一行都作为 B 的输入单独和立即处理。但我不想等待 A 终止,而是为每条快速出现的行调用一个新的 B。然后 B 会在 A 的输出中添加一些东西让我们说:

$ A <for every line appearing> B
1 apple
1 pear
1 banana

我怎么能用 bash 做到这一点?

更新

以下是原始命令:

$sudo alive6 -l eth1 -W 0.2 | sed -e 's/Alive: \(.*\) \[ICMP echo-reply\]/\1%eth0/' -e'/Scanned.*/d' -e'//d'

立即响应,而

$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完成

4

3 回答 3

1
A | while read -r l; do B &; done

B在后台运行以解决以下要求:作为 B 的输入单独和 立即处理的行。

于 2013-06-25T10:29:24.057 回答
0

用于unbuffer禁用A的行缓冲。

$ unbuffer A <for every line appearing> B
于 2013-06-25T10:29:37.100 回答
0

在 Bash 中:

while read -r -u 9 line || [ -n "$line" ]
do
    B "$line"
done 9< <(A)
  • 即使A打印反斜杠也可以工作。
  • 即使 的输出A不以换行符结尾也可以工作。
  • 即使B读取标准输入也可以工作,但如果它出于某种原因读取文件描述符 9 则无法工作。在这种情况下,您必须使用mkfifo.
  • 同步运行B,异步处理输出A
于 2013-06-25T10:43:06.520 回答