cat file | … vs … <file
是否存在
从常规文件读取时,
使块大小问题显而易见的快速简便方法:
1 2 3 4 | $ 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% |
除了其他用户发布的内容外,使用文件中的输入重定向时,标准输入是文件,但将cat的输出通过管道传递到输入时,标准输入是包含文件内容的流。当使用标准输入时,该文件将能够在该文件中进行搜索,但是管道将不允许该文件。您可以通过找到一个zip文件并运行以下命令来查看此内容:
1 | zipinfo /dev/stdin < thezipfile.zip |
和
1 | cat thezipfile.zip | zipinfo /dev/stdin |
第一个命令将显示zipfile的内容,而第二个命令将显示错误,尽管这是一个误导性错误,因为zipinfo不会检查seek调用的结果,并且稍后会出现错误。
总是要避免不必要地使用猫。这就像手刹开着。它浪费了CPU周期,而OS则不断在cat进程和管道中的下一个进程之间进行上下文切换。如果世界上所有无用的猫消失了,而不再发明,重新发明,从父辈传给儿子,那么我们就不会发生全球变暖,因为我们可以轻松地节省1.21吉瓦的电力。
谢谢。我现在感觉好多了。请加入我的十字军东征,以消除在stackoverflow上对猫的无用使用。据我所知,这个网站是无用猫繁殖的主要贡献。我不怪新手,但我确实想教他们。世界上的工人和新手,松开手刹,拯救地球!!!! 1!
另一个区别是对输入文件的阻塞
例如,假设输入是没有写程序的FIFO,则一次调用将不会生成任何子程序,直到打开输入文件为止,而另一次调用将生成两个进程:
1 2 | 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) |
实际上,除了人为情况外,这几乎无关紧要。例如,
管道使右侧命令中的子shell被调用。这会干扰环境变量。
1 2 3 4 5 | cat foo | while read line do ... done echo"$line" |
与
1 2 3 4 5 | while read line do ... done < foo echo"$line" |