管道和运行命令之间有什么区别?

时间:2016-02-21 17:38:05

标签: unix

run是一个处理来自stdin的输入并在stdout上输出结果的文件

我写的时候:

$ ./run < in.json > actual.json 
$ diff out.json actual.json 

我认为没有区别

所以当我写:

$ ./run < in.json > actual.json | diff out.json actual.json

我希望它返回没有区别 但相反,我得到的是out.json

中的所有内容

这两个命令有什么区别?根据我的理解,管道(|)执行左边的命令然后执行右边的命令,所以它们应该是相同的命令

2 个答案:

答案 0 :(得分:2)

  

根据我的理解,管道(|)执行左侧的命令,然后执行右侧的命令,这样它们应该是相同的命令

这是完全错误的。

两个程序同时执行;第一个的输出被重定向到第二个的输入。

这意味着在你的

$ ./run < in.json > actual.json | diff out.json actual.json

diff在未写入actual.json时开始,因此它为空,因此out.json的所有内容都是新的。

答案 1 :(得分:0)

你可以在./run完成时让差异开始。

./ run&lt; in.json&gt; actual.json; diff out.json actual.json

当你只为你的差异使用actual.json时,你可以做

diff out.json <(./run < in.json)

编辑:正如@Glenn所建议的,我删除了不相关的例子。