猫文件| ......对......

时间:2010-03-31 11:21:57

标签: unix shell pipe puzzle

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

7 个答案:

答案 0 :(得分:11)

从常规文件中读取时,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 :(得分:5)

cat将允许您按顺序管道多个文件。否则,<重定向和cat file |会产生相同的副作用。

答案 2 :(得分:4)

除了其他用户发布的内容之外,当使用文件中的输入重定向时,标准输入是文件,但是当将cat的输出传递给输入时,标准输入是包含文件内容的流。当标准输入时,文件将能够在文件中搜索,但管道将不允许它。您可以通过查找zip文件并运行以下命令来查看:

zipinfo /dev/stdin < thezipfile.zip

cat thezipfile.zip | zipinfo /dev/stdin

第一个命令将显示zipfile的内容,而第二个命令将显示错误,但这是一个误导性的错误,因为zipinfo不会检查搜索调用的结果和稍后的错误。

答案 3 :(得分:3)

总是要避免使用无用的猫。它非常像用手刹驱动。它没有浪费CPU周期,操作系统不断在cat进程和管道中的下一个进程之间进行上下文切换。如果世界上所有无用的猫都消失了,不再被发明,重新发明,从父亲传给儿子,我们就不会有全球变暖,因为我们很容易就能节省1.21吉瓦的电力。

感谢。我现在感觉好多了。请加入我的讨伐,以便在stackoverflow上消除无用的猫。据我所知,这个网站是对无用猫扩散的主要贡献。我不怪新手,但我确实想教他们。世界各地的工人和新手,放松手刹,拯救地球!!! 1!

答案 4 :(得分:2)

Pipes导致为右侧的命令调用子shell。这会干扰环境变量。

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

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

答案 5 :(得分:2)

另一个区别是输入文件的阻塞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 nonblocking?)

答案 6 :(得分:1)

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