是否存在...
或上下文cat file | ...
的行为与... <file
不同?cat file | ... vs ... <文件
回答
从常规文件中读取数据时,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%
有趣的是,尽管read()使用了有限的缓冲区,无论哪种方式,你会碰到一些进程最小缓冲区大小strace表明,猫在我的平台上使用32kB读取和pv 128kB。 – msw 2010-03-31 11:41:47
哦,嘿,我的例子并不符合这个问题,因为我没有使用
@msw它将*非常依赖于'cat'的实现,但我会尝试以不同的方式使它变得明显。 – 2010-03-31 12:02:36
cat file |
启动另一个程序(猫),不必在第二种情况下启动。如果你想使用“这里的文件”,它也会让你更加困惑。但它应该表现得一样。
cat
将允许您依次传输多个文件。否则,<
重定向和cat file |
产生相同的副作用。
管道引起调用在右边的命令,一个子shell。这干扰了环境变量。
cat foo | while read line
do
...
done
echo "$line"
与
while read line
do
...
done < foo
echo "$line"
当我尝试它们时,两者都给出了相同的结果。 – 2010-03-31 14:56:50
有趣的副作用。 – pra 2010-03-31 15:07:01
@JB:在循环内设置一个变量,然后在循环之后回显它。更改后的值只会在重定向表单之后持续存在,并且不会在管道表单之后存在。另一个示例是循环后的“cd”和循环后的“pwd”。 – 2010-04-09 19:54:51
除了其他帮助的东西,使用从文件输入重定向时,标准输入是文件,但管道猫的输出与输入的时候,标准输入一个包含文件内容的流。当标准输入是文件将能够在文件内寻找,但管道不会允许它。你可以找到一个zip文件,运行以下命令看到:
zipinfo /dev/stdin < thezipfile.zip
和
cat thezipfile.zip | zipinfo /dev/stdin
的第一个命令将显示压缩文件的内容,而第二个会显示一个错误,虽然它是一个令人误解的错误,因为zipinfo不会在稍后检查查找调用和错误的结果。
A 无用的猫的使用是总是要避免。这是喜欢驾驶与手刹。它毫无用处地浪费CPU周期,操作系统不断在cat过程和管道中的下一个过程之间进行上下文切换。如果所有世界上无用的猫都消失了,不再被发明,重新发明,从父亲传到儿子,我们就不会有全球变暖,因为我们可以轻松地节省1.21千兆瓦的电力。
谢谢。我现在感觉好多了。请加入我的十字军东征,以消除在stackoverflow上无用的猫。就我所知,这个网站是对无用猫繁殖的重大贡献。我不会责怪新手,但我确实想教他们。世界的工人和新手,放松手刹,拯救地球!!! 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非阻塞?)
- 1. `cat <file`和`cat file`有什么区别?
- 2. perl中的foreach x(cat file)?
- 3. unix中的cat文件名和cat <filename的区别
- 4. FILE VS fstream的
- 5. `cat <does_not_exist | perl`成功
- 6. ArrayList <File>包含文件名
- 7. 如何将shared_ptr <FILE>转换为C++中的FILE *文件?
- 8. 使用C#创建.cat文件#
- 9. PHP性能file_get_contents()vs readfile()和cat
- 10. grep vs cat和grep的区别
- 11. Shell脚本:cat vs echo输出
- 12. git add -A vs git add file
- 13. PostgreSQL COPY FROM file vs STDIN
- 14. 。MikeOS中的.CAT文件
- 15. 如何解析* .cat文件
- 16. Sandcastle Help File Builder和VS 2008
- 17. ./file与文件
- 18. Linux在使用“cat”后返回“select:Bad file descriptor”错误
- 19. hadoop fs -text vs hadoop fs -cat vs hadoop fs -get
- 20. 运行scala时出现“cat:/ release:No such file or directory”
- 21. pid =`cat $ pidfile`或读取pid <$ pidfile?
- 22. <input type =“file”/>
- 23. Flume exec to cat file只写一行到hdfs sink
- 24. 为什么不使用<< EOF代替cat << EOF?
- 25. 文件浏览器控件替换<input type =“file”>
- 26. PowerShell:为什么“Get-Content <file> | Out-File -Andnd <file>”进入循环?
- 27. Uri with File:/// vs Content:// - 检索音乐文件信息
- 28. web config <appSettings file =“config file in separate projects”></ appSettings>
- 29. Visual Studio 2005:File-> New-> Project vs File-> New-> Web Site?
- 30. javafx CheckBoxTreeItem <File> TreeView <File>。如何仅显示文件的名称而不显示完整路径?
如果你问为什么你看到一种形式或其他地方使用的形式,它似乎是个人喜好的问题。 Kernighan和Pike在1984年指出:http://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X – msw 2010-03-31 11:31:25
属于superuser.com – 2010-03-31 12:09:35