1

请在下面的cmd上解释我:

touch temp.txt
touch temp1.txt
who > temp.txt &
cat temp.txt | wc -l >temp1.txt  &

说一下 temp.txt 文件是一个空文件。那么,执行后会出现什么temp.txt文件temp1.txt

由于作业在后台模式下运行,有人可以解释可能的情况吗?

4

2 回答 2

0

temp.txt何时运行的状态cat超出了您的控制(取决于调度程序何时catwho运行相对于彼此),因此您无法预测会发生什么。更安全的版本是

# These two commands are unnecessary. The files will be created
# when opened for writing.
# touch temp.txt
# touch temp1.txt
who | tee temp.txt | wc -l > temp1.txt &  # If it really needs to run in the background
于 2013-07-25T15:04:14.503 回答
0

这取决于。 cat(1)可能会在其输入文件中看到一些东西或什么也没有。

这是最后两个命令中发生的事情的非常粗略的图片。(我忽略了这些touch(1)调用,因为它们是同步的。)

  • who >f1
    一个孩子被分叉,输出文件被破坏,输出文件移动到孩子的标准输出,并运行一个新程序。
  • cat f2 | wc -l>f2
    一个孩子被分叉,一个管道被制造,另一个孩子被分叉,孩子们将他们的管道末端适当地移动到标准输入或标准输出,一个孩子运行一个命令,该命令将打开输入文件,另一个孩子 clobbers 输出等等,如上所述。

我不保证这实际上就是你的 shell 正在做的事情——也许它在分叉之前就崩溃了,等等——但这已经足够接近了。因此,让我们将这些 shell 命令放在时间维度上:

[time =====================================================================>]

# who >f1
-?->[clobber *f1*]-?->[dup to stdout]-?->[exec who(1)]-?->[...]

# cat f1 | wc -l>f2
-?->[pipe]-?->[fork]-?->[dup pipe]-?->[clobber *f2*]-?->[dup to stdout]-?->[exec wc(1)]
                +----?->[dup pipe]-?->[exec cat(1)]-?->[open *f1*]-?->[...]

上面的每一个-?->箭头都可以任意长或短——你无法控制。也许在第一个破坏者之前cat(1)运行(看到旧数据?),也许不是。也许它在有机会写输出之前运行,也许没有。who(1)

于 2013-07-25T15:04:26.140 回答