2010-03-31 56 views
13

是否存在...或上下文cat file | ...的行为与... <file不同?cat file | ... vs ... <文件

+0

如果你问为什么你看到一种形式或其他地方使用的形式,它似乎是个人喜好的问题。 Kernighan和Pike在1984年指出:http://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X – msw 2010-03-31 11:31:25

+1

属于superuser.com – 2010-03-31 12:09:35

回答

9

从常规文件中读取数据时,cat负责读取数据,根据需要执行数据,并可能将数据写入流水线。显然,内容本身被保留,但其他任何东西都可能被污染。例如:块大小和数据到达时间。此外,管道本身并不总是中性的:它用作输入和...之间的附加缓冲区。

快速简便的方法,使块大小问题明显:

$ cat large-file | pv >/dev/null 
5,44GB 0:00:14 [ 393MB/s] [    <=>         ] 
$ pv <large-file >/dev/null 
5,44GB 0:00:03 [1,72GB/s] [=================================>] 100% 
+1

有趣的是,尽管read()使用了有限的缓冲区,无论哪种方式,你会碰到一些进程最小缓冲区大小strace表明,猫在我的平台上使用32kB读取和pv 128kB。 – msw 2010-03-31 11:41:47

+0

哦,嘿,我的例子并不符合这个问题,因为我没有使用 2010-03-31 11:51:02

+0

@msw它将*非常依赖于'cat'的实现,但我会尝试以不同的方式使它变得明显。 – 2010-03-31 12:02:36

1

cat file |启动另一个程序(猫),不必在第二种情况下启动。如果你想使用“这里的文件”,它也会让你更加困惑。但它应该表现得一样。

4

cat将允许您依次传输多个文件。否则,<重定向和cat file |产生相同的副作用。

2

管道引起调用在右边的命令,一个子shell。这干扰了环境变量。

cat foo | while read line 
do 
    ... 
done 
echo "$line" 

while read line 
do 
    ... 
done < foo 
echo "$line" 
+0

当我尝试它们时,两者都给出了相同的结果。 – 2010-03-31 14:56:50

+0

有趣的副作用。 – pra 2010-03-31 15:07:01

+0

@JB:在循环内设置一个变量,然后在循环之后回显它。更改后的值只会在重定向表单之后持续存在,并且不会在管道表单之后存在。另一个示例是循环后的“cd”和循环后的“pwd”。 – 2010-04-09 19:54:51

4

除了其他帮助的东西,使用从文件输入重定向时,标准输入是文件,但管道猫的输出与输入的时候,标准输入一个包含文件内容的流。当标准输入是文件将能够在文件内寻找,但管道不会允许它。你可以找到一个zip文件,运行以下命令看到:

zipinfo /dev/stdin < thezipfile.zip 

cat thezipfile.zip | zipinfo /dev/stdin 

的第一个命令将显示压缩文件的内容,而第二个会显示一个错误,虽然它是一个令人误解的错误,因为zipinfo不会在稍后检查查找调用和错误的结果。

3

A 无用的猫的使用是总是要避免。这是喜欢驾驶与手刹。它毫无用处地浪费CPU周期,操作系统不断在cat过程和管道中的下一个过程之间进行上下文切换。如果所有世界上无用的猫都消失了,不再被发明,重新发明,从父亲传到儿子,我们就不会有全球变暖,因为我们可以轻松地节省1.21千兆瓦的电力。

谢谢。我现在感觉好多了。请加入我的十字军东征,以消除在stackoverflow上无用的猫。就我所知,这个网站是对无用猫繁殖的重大贡献。我不会责怪新手,但我确实想教他们。世界的工人和新手,放松手刹,拯救地球!!! 1!

1

另一个区别是输入文件的阻塞open()的行为。

例如,假设输入是没有作家FIFO,一个调用将不生成任何儿童节目,直到输入文件被打开,而其他将产生两个过程:

prog ... < a_fifo  # 'prog' not launched until shell can open file 
cat a_fifo | prog ... # 'prog' and 'cat' are running (latter may block on open) 

在实践中这种情况很少除了在人为设计的情况下。 prog可能会在等待输入的情况下定期记录或执行一些清理工作,例如,即使没有可用输入,您也可能想要这样做。 (为什么prog要足够复杂以打开自己的输入FIFO非阻塞?)

相关问题