除了创建 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)
}
两个命令行之间的另一个区别是,使用管道时,两个命令同时运行。左侧命令是写入,右侧命令是读取。如果一个程序比另一个程序太慢(在读/写方面),则较快的程序将暂时阻塞,直到较慢的程序赶上。
&&
在两个命令在中间运行的情况下,它们显然是在彼此之后运行的。直到第一个命令完成并以零退出状态终止后,第二个命令才会启动。