是否存在...
或上下文cat file | ...
的行为与... <file
不同的情况?
答案 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”,它也会让你更加困惑。但它应该表现得一样。