请在下面的cmd上解释我:
touch temp.txt
touch temp1.txt
who > temp.txt &
cat temp.txt | wc -l >temp1.txt &
说一下 temp.txt 文件是一个空文件。那么,执行后会出现什么temp.txt
文件temp1.txt
。
由于作业在后台模式下运行,有人可以解释可能的情况吗?
请在下面的cmd上解释我:
touch temp.txt
touch temp1.txt
who > temp.txt &
cat temp.txt | wc -l >temp1.txt &
说一下 temp.txt 文件是一个空文件。那么,执行后会出现什么temp.txt
文件temp1.txt
。
由于作业在后台模式下运行,有人可以解释可能的情况吗?
temp.txt
何时运行的状态cat
超出了您的控制(取决于调度程序何时cat
和who
运行相对于彼此),因此您无法预测会发生什么。更安全的版本是
# 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
这取决于。 cat(1)
可能会在其输入文件中看到一些东西或什么也没有。
这是最后两个命令中发生的事情的非常粗略的图片。(我忽略了这些touch(1)
调用,因为它们是同步的。)
who >f1
cat f2 | wc -l>f2
我不保证这实际上就是你的 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)