如何在Bash中添加到流中?

Pau*_*aul 3 bash pipe stream prepend

假设我在bash中有以下命令:

one | two
Run Code Online (Sandbox Code Playgroud)

one运行很长一段时间产生一个输出流并two对该流的每一行执行快速操作,但two根本不起作用,除非它读取的第一个值告诉它每行读取多少个值.one没有输出那个值,但我知道它是什么(让我们说它是15).我想15\n在输出之前通过管道发送一个one.我不想修改onetwo.

我的第一个想法是:

echo "$(echo 15; one)" | two
Run Code Online (Sandbox Code Playgroud)

这给了我正确的输出,但在命令one完成之前它根本不会流过管道.我希望输出立即通过管道开始流式传输,因为它需要很长时间才能执行(几个月).

我也尝试过:

echo 15; one | two
Run Code Online (Sandbox Code Playgroud)

当然,它输出15,但不通过管道发送two.

在bash中有没有办法通过管道传递'15 \n'然后开始one通过同一个管道传输输出?

gle*_*man 13

你只需要shell分组结构:

{ echo 15; one; } | two
Run Code Online (Sandbox Code Playgroud)

支撑周围的空间和后面的分号是必需的.

去测试:

one() { sleep 5; echo done; }
two() { while read line; do date "+%T - $line"; done; }
{ printf "%s\n" 1 2 3; one; } | two
Run Code Online (Sandbox Code Playgroud)
16:29:53 - 1
16:29:53 - 2
16:29:53 - 3
16:29:58 - done
Run Code Online (Sandbox Code Playgroud)


gni*_*urf 5

使用命令分组

{ echo 15; one; } | two
Run Code Online (Sandbox Code Playgroud)

完毕!