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

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

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

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

然而与这个围棋程序读取标准输入,它按照管道的预期工作,但对于第二种形式,它的行为就像没有收到输入一样。

答案1

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

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

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

&&在两个命令在中间运行的情况下,它们显然是在彼此之后运行的。直到第一个命令完成并以零退出状态终止后,第二个命令才会启动。

相关内容