如何防止符号链接在自身内部创建?

如何防止符号链接在自身内部创建?

运行以下命令按预期工作,创建到srcfrom 的符号链接include/bb

ln -sf ../src include/bb

但是,再次调用相同的命令将导致在akasrc中创建额外的符号链接。include/bbsrc/src

我可以做什么来预防它?


编辑:

显然,当ln被调用两次时就会发生这种情况,毕竟分号可能与它无关。

以下是导致这种情况发生的一系列命令:

mkdir test
cd test
mkdir src
touch src/main.cpp
mkdir include
ln -sf ../src include/bb
ln -sf ../src include/bb

答案1

ln -s ../src include/bb

include/bb要么创建一个名为引用../src(相对于其位置)的链接,要么创建一个include/bb/src引用../src(相对于其位置)的文件。后者是如果include/bb存在并且是一个目录(实际上或作为目录的链接)的情况。

因此,当您执行一次命令后,现在有一个链接include/bb指出目录src,与include.即,include/bb现在是一个目录。因此,当您下次执行该命令时,一个名为 的新链接src将添加到该目录。

与 无关;

您可能打算使用

ln -sTf ../src include/bb

相反,以便 (by -T) 告诉ln将任何现有文件include/bb视为普通文件(即使它是引用目录的链接),并 (by -f) 强制替换该文件。

答案2

当你跑步时

ln -s ../src include/bb
ln -s ../src include/bb

include/bb第一行创建到目录的链接../src(这是您所期望的)。

第二个发现include/bb已经存在。如果它是常规文件或常规文件的符号链接,那将是一个错误(除非您-f也给出了)。相反,它是一个符号链接目录 ../src,在上一步中创建。什么时候ln目标操作数是一个目录:

实用程序应为由 a 指定的每个文件创建一个新的符号链接source_file操作数,位于名为的现有目录中的目标路径target_dir

所以这一次您要求创建一个到../srcinside的链接include/bb/,这是一个目录(的链接)。这些链接默认根据其现有的基本名称进行命名,src在本例中就是如此。如果你第三次运行它,你会得到一个错误,因为../src/src现在存在。


include/bb您可以通过每次使用 时事先删除链接来避免这种情况rm include/bb。分号与此无关。

相关内容