Pau*_*aul 3 bash pipe stream prepend
假设我在bash中有以下命令:
one | two
Run Code Online (Sandbox Code Playgroud)
one运行很长一段时间产生一个输出流并two对该流的每一行执行快速操作,但two根本不起作用,除非它读取的第一个值告诉它每行读取多少个值.one没有输出那个值,但我知道它是什么(让我们说它是15).我想15\n在输出之前通过管道发送一个one.我不想修改one或two.
我的第一个想法是:
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)