为什么从文件中获取stdin与通过管道接收stdin不同?

tlr*_*rrd 8 unix bash pipe

使用bash我经常想得到一个大型csv文件的标题,并搜索其余的特定条目.我这样做如下.

$ (head -1; grep mike) < tmp.csv
name,age,favourite colour
mike,38,blue
Run Code Online (Sandbox Code Playgroud)

但是从cat或任何其他命令获取输入不起作用 - 似乎grep永远不会传递文件的其余部分.

$ cat tmp.csv | (head -1; grep mike)
name,age,favourite colour
Run Code Online (Sandbox Code Playgroud)

为什么这两种情况会有不同的行为?

evi*_*tto 7

从管道读取和从文件读取之间的区别在于,您可以lseek在文件上,但不能在管道上.

这里的行为看起来(如透视strace)就像是来自而head不是bash. head将读取缓冲区并找到适当数量的行,然后返回lseek到最后输出行结束的点,使文件句柄在该位置打开.如上所述,如果它正在读取文件,则会起作用,但如果它正在从管道读取则不行.

我想不出任何情况下其他比你在做什么,这个地方行为head是有道理的,但它是.我每天都在学习新东西,我告诉你......