为什么鱼的回声内置与bash的内置行为不同?

时间:2014-12-14 22:54:51

标签: fish

如果函数bar每秒运行echo bar,我希望bar | cat每秒打印一行。它不是。在我点击^C之前,它不会打印任何内容。似乎有一些多余的缓冲正在进行。

yes | cat效果很好。 bar | cat在bash中按预期工作。

至于为什么这很重要,请参阅this other question

1 个答案:

答案 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内置函数,因此该值对于下一个命令不可见。这应该让你对鱼为什么直接运行内置物有所了解。