Linux 中流水线和重定向的区别
谁能告诉我有什么区别吗?例如:
如果我有一个包含以下内容的文件 a.txt
:
一个
b
有什么区别cat 和 cat < a.txt
在我看来,它们都模拟 STDIN,这是正确的还是有差异?多谢。
Can anyone tell me the difference? for example:
if I have a file a.txt
with the following content:
a
b
c
what would be the difference between cat a.txt | cat
and cat < a.txt
It seems to me that they all simulate STDIN, is that correct, or are there differences? Thanks a lot.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
管道从一个进程到另一个进程(第一个示例中的猫),因此需要两个进程合作。重定向由 shell 本身处理。在 shell 中执行操作(例如使用变量)时,这一点可能很重要。
Piping works from one process to another (the
cat
s in the first example), and hence requires two processes cooperating. Redirection is handled by the shell itself. This can matter when doing things in the shell such as working with variables.重定向不会“模拟 STDIN”。当您重定向时,文件是进程的标准输入。特别是,如果输入是常规文件,则许多程序的行为与管道或 tty 不同,因此您可能会得到不同的行为。例如:
The redirection does not "simulate STDIN". When you redirect, the file is the stdin for the process. In particular, many programs have different behavior if the input is a regular file than if it is a pipe or a tty, so you may get different behavior. For example:
首先,两个结果是相同的。没什么可说的。
关于
cat a.txt | 的工作原理cat
,第一个 cat 接受参数a.txt
,然后打印其内容。您将第一个的stdout
通过管道传输到第二个的stdin
。第二个cat
找不到参数,因此它从stdin
读取内容并打印它。由于您在第二个命令中使用了
<
,系统会将cat
的stdin
替换为a.txt
的文件流。其他方面与第一种情况中的第二只猫相同。Firstly, two results are same. Nothing to say.
For the work principle of
cat a.txt | cat
, the first cat takes argumenta.txt
, then prints its content. You pipe thestdout
of the first tostdin
of the second. The secondcat
finds no argument so it reads content fromstdin
, and prints it.Because you use
<
in the second command, system replacesstdin
ofcat
with file stream ofa.txt
. Anything else is same as the second cat in the first case.