如果函数bar
每秒运行echo bar
,我希望bar | cat
每秒打印一行。它不是。在我点击^C
之前,它不会打印任何内容。似乎有一些多余的缓冲正在进行。
yes | cat
效果很好。 bar | cat
在bash中按预期工作。
至于为什么这很重要,请参阅this other question。
答案 0 :(得分:1)
我们在管道中有一个内置命令:
echo bar | cat
bash分叉新进程来执行管道中的内置函数。所以有两个新流程:一个用于cat
,另一个用于运行内置echo
。这些流程是通过连接它们的管道创建的,它们是独立运行的。
fish总是直接运行内置函数,而不为它们创建新进程。因此它执行echo bar
,然后将输出发送到cat
。内置和函数(但不是外部命令)的输入和输出是完全缓冲的。我们正在努力消除这种限制,但我们还没有。
在这种情况下,bash行为可能看起来更合适,但是它的价格很高,这就是内置函数和函数在管道内执行不同的操作(或者只是不起作用)。例如:
echo foo | read some_var ; echo $some_var
在鱼类中,这将设置some_var=foo
,正如您所期望的那样。在bash中,这无声地失败:赋值“工作”,但仅在生成的瞬态进程内执行read
内置函数,因此该值对于下一个命令不可见。这应该让你对鱼为什么直接运行内置物有所了解。