rm最后是&符号而没有

时间:2017-07-26 08:46:00

标签: linux bash makefile scripting

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

假设您有一个大型脚本文件,用于编译和清理。还假设您在此文件的同一目录中有名为folder的文件夹。此外,在此文件的末尾,您有以下代码行:

clean:
    rm -r -f folder &                    

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

clean:
    rm -r -f folder

然后在您尝试清理之后,您将收到以下错误:

rm: cannot remove 'folder': Directory not empty

但如果您再次尝试清洁,则会根据需要清除文件夹。

我需要找到所有可能的原因,这怎么可能发生。我唯一能想到的是,如果我们在运行这个脚本的几个线程之间有一些竞争。然后我被问到 - "如果只有一个线程运行代码怎么办?"
我没有看到这个问题怎么会在一个线程中发生 - 但似乎我错了,我不知道为什么。 还有哪些其他情况会导致上述错误?

编辑:在采访中,我还可以假设以下内容:
(1)。脚本文件中的其他位置没有&符号,但是我写的rm代码行 (2)。执行rm

时,folder中不会创建新文件

3 个答案:

答案 0 :(得分:1)

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

无论如何,在典型的采访场景中,你需要猜测采访者在他们的剧本中的答案。至少在您的问题中,问题的描述可能是错误的(如果在采访中也出现了错误的情况,那也不会是不寻常的)。如果错误消息出现在&存在且您运行make clean all,则该问题具有一定的理论意义。然后,新构建会创建阻止删除目录的文件。这就是为什么你不应该在makefile配方中使用&

答案 1 :(得分:0)

AFAIK,在shell中,当进程在后台运行时,无法获取进程的状态。这个过程可能无止境地进行 - 可能需要几个小时。只有前台进程会给你退出代码。因此,make永远无法检查带符号的任何命令的状态。请检查以下内容:

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

答案 2 :(得分:0)

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

然而,他们的解决方法似乎是虚假的。将失败的rm来电推向后台以避免make获得有关失败的知识并不是一个解决方法。在-之前添加一行会产生相同的结果,同时避免可能的竞争条件。