管道和读数输入之间的区别

Man*_* T. 2 bash pipe io-redirection

除了创建 tmp 文件(显然)之外,cmd1 > tmp && cmd2 < tmp和之间有什么区别cmd1 | cmd2

如果我对管道的理解是正确的,我希望在两种情况下都cmd2标准输入中读取输出cmd1,所以我期望这两者的行为相同。

然而,对于这个读取标准输入的go 程序,它与管道一起工作,但对于第二种形式,它就像没有收到输入一样。

Kus*_*nda 5

Go 程序似乎明确测试标准输入是否是管道,如果不是,则退出并显示诊断消息:

fi, err := os.Stdin.Stat()
if err != nil {
        fatal(err)
}
if fi.Mode()&os.ModeNamedPipe == 0 {
        usage()
        os.Exit(1)
}
Run Code Online (Sandbox Code Playgroud)

两个命令行之间的另一个区别是使用管道,两个命令同时运行。左侧命令是书写,右侧命令是阅读。如果一个对另一个来说太慢(在读/写方面),较快的程序将暂时阻塞,直到较慢的程序赶上。

在这两个命令&&中间运行的情况下,它们显然是接连运行的。在第一个命令完成并以零退出状态终止之前,第二个命令不会启动。