同一脚本的不同结果

Different results from same script

所以我有这个脚本

rm -f foo bar; cat foo > bar | cat bar > foo

我第一次在 运行 Ubuntu 的机器上尝试 运行 它。我原以为 cat foo 期间会出现错误,但 运行 成功了。然后我在 AWS Cloud9 上尝试了 运行(也在 Ubuntu 的相同版本上运行),它给了我最初预期的错误。

之后,我在不同的在线 bash 编译器上尝试了 运行 相同的命令,每个编译器再次给了我不同的输出。第一个 运行 成功,第二个返回 2 个错误(foo 不是文件,bar 不是文件)。

为什么不同的机器从同一个脚本给出不同的输出?

这是一个具有多种可能结果的竞争条件,具体取决于安排的顺序和时间进程:

  1. 负责 cat foo > bar 的 shell 进程被调度,创建 bar,执行 cat,退出并出现关于 foo[=50= 的错误]
  2. cat bar > foo 同样运行,创建 foo,读取 bar 为空。

  1. cat bar > foo 运行,创建 foo,退出并出现关于 bar
  2. 的错误
  3. cat foo > bar 运行,创建 bar,读取 foo 为空。

  1. cat foo > bar 运行,创建 bar,被抢占
  2. cat bar > foo 运行,创建 foo,被抢占
  3. cat foo 读取 foo 为空
  4. cat bar 读取 bar 为空

因此,它可以在同一台机器和不同机器上给出不同的结果。