与&符号在最后和没有

这是我被问到的面试问题。

假设你有一个大的脚本文件,用于编译和清理目的。 另外假定你在这个文件的同一个目录下有文件夹命名的folder 。 另外,在这个文件的最后,你有下面的代码行:

 clean: rm -r -f folder & 

当你尝试清理一个项目,假设它工作正常。 但是,如果我们删除&符号并写下:

 clean: rm -r -f folder 

然后在尝试清理之后,会出现以下错误:

 rm: cannot remove 'folder': Directory not empty 

但是,如果您尝试再次清洁,文件夹将根据需要进行清洁。

我需要find所有可能的原因,怎么会发生这种情况。 我能想到的唯一的事情就是如果我们在运行这个脚本的几个线程之间有一些竞争。 然后问我:“如果只有一个线程运行代码呢?”
我不知道这个问题怎么会发生在一个线程上,但似乎我错了,我不知道为什么。 还有什么其他的情况会导致上面的错误?

编辑:在采访中,我也可以假设如下:
(1)。 在脚本文件的其他地方没有和号,而是我写的rm代码行。
(2)。 执行rm时不会在folder创build新文件

我很高兴这是一个虚构的问题。 在makefiles中使用&这种方式完全是假的; 希望没有人在现实世界中这样做。

无论如何,在一个典型的面试场景中,你需要猜测面试官在脚本中的答案。 至少在你的问题中,这个问题很可能被错误地描述了(如果面试中出现了错误的情况,这也不是不常见的)。 如果错误信息与& present发生,并且您运行make clean all ,那么这个问题有一定的理论意义。 然后,新建立创建文件,防止删除目录。 这就是为什么你不应该在makefile食谱中使用&

AFAIK,在一个shell中,当一个进程在后台运行,你不能得到进程的状态。 这个过程可能无限期 – 也许几个小时。 只有前台进程会给你退出代码。 所以, make将永远不能用&符来检查任何命令的状态。 检查以下内容:

 % true % ls /non-exist-file & % echo $? 

我只能假设一个单一的原因:他们是在Mac OS X上,并击中了HFS +的旧bug,在某些情况下readdir()系统调用产生不正确的结果。 他们只是想知道你是否了解它(见: https : //www.postgresql.org/message-id/51549ea20911051659j62a3959ct8b2f2e702953cf83@mail.gmail.com )

然而,他们的解决方法似乎是虚假的。 推一个失败的电话到后台,以避免获得有关失败的知识是不是一个修复。 前面加上-会得到相同的结果,同时避免可能的竞争条件。