来自同一脚本的不同结果

问题描述

所以我有这个脚本

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的错误
  2. cat bar > foo同样运行,创建foo,将bar读为空。

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...