【发布时间】:2020-09-21 17:52:10
【问题描述】:
所以我有这个脚本
rm -f foo bar; cat foo > bar | cat bar > foo
我首先尝试在运行 Ubuntu 的机器上运行它。我原以为在cat foo 期间会出错,但它运行成功。然后我尝试在 AWS Cloud9 上运行它(也运行在相同版本的 Ubuntu 上),它给了我最初期望的错误。
之后,我尝试在不同的在线 bash 编译器上运行相同的命令,它们中的每一个都再次给了我不同的输出。第一个运行成功,第二个返回2个错误(foo不是文件,bar不是文件)。
为什么不同的机器从同一个脚本给出不同的输出?
【问题讨论】:
-
此代码有竞争条件。它不仅在不同的机器之间会有所不同,而且在您在同一台机器上运行它的不同时间之间也会有所不同。
-
(请注意,它可能通常在一台机器上以一种方式运行,而通常在另一台机器上以不同方式运行,如果两者之间存在差异操作系统/负载配置文件/缓存设置等影响操作的时间;但两种行为都不比另一种更正确:您描述的两种结果对于按指定操作的 shell 解释器都是合法的。
-
@Amessihel,……没错。在 fork 的每一侧,输出文件的打开将在该侧的
cat副本执行之前发生,但不能保证 fork 的一侧会领先于另一侧(或不会)。
标签: bash sh stdout io-redirection