同一脚本的不同结果
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 不是文件)。
为什么不同的机器从同一个脚本给出不同的输出?
这是一个具有多种可能结果的竞争条件,具体取决于安排的顺序和时间进程:
- 负责
cat foo > bar
的 shell 进程被调度,创建 bar
,执行 cat
,退出并出现关于 foo
[=50= 的错误]
cat bar > foo
同样运行,创建 foo
,读取 bar
为空。
或
cat bar > foo
运行,创建 foo
,退出并出现关于 bar
的错误
cat foo > bar
运行,创建 bar
,读取 foo
为空。
或
cat foo > bar
运行,创建 bar
,被抢占
cat bar > foo
运行,创建 foo
,被抢占
cat foo
读取 foo
为空
cat bar
读取 bar
为空
因此,它可以在同一台机器和不同机器上给出不同的结果。
所以我有这个脚本
rm -f foo bar; cat foo > bar | cat bar > foo
我第一次在 运行 Ubuntu 的机器上尝试 运行 它。我原以为 cat foo
期间会出现错误,但 运行 成功了。然后我在 AWS Cloud9 上尝试了 运行(也在 Ubuntu 的相同版本上运行),它给了我最初预期的错误。
之后,我在不同的在线 bash 编译器上尝试了 运行 相同的命令,每个编译器再次给了我不同的输出。第一个 运行 成功,第二个返回 2 个错误(foo 不是文件,bar 不是文件)。
为什么不同的机器从同一个脚本给出不同的输出?
这是一个具有多种可能结果的竞争条件,具体取决于安排的顺序和时间进程:
- 负责
cat foo > bar
的 shell 进程被调度,创建bar
,执行cat
,退出并出现关于foo
[=50= 的错误] cat bar > foo
同样运行,创建foo
,读取bar
为空。
或
cat bar > foo
运行,创建foo
,退出并出现关于bar
的错误
cat foo > bar
运行,创建bar
,读取foo
为空。
或
cat foo > bar
运行,创建bar
,被抢占cat bar > foo
运行,创建foo
,被抢占cat foo
读取foo
为空cat bar
读取bar
为空
因此,它可以在同一台机器和不同机器上给出不同的结果。