运行以下命令按预期工作,创建到src
from 的符号链接include/bb
:
ln -sf ../src include/bb
但是,再次调用相同的命令将导致在akasrc
中创建额外的符号链接。include/bb
src/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
。
所以这一次您要求创建一个到../src
inside的链接include/bb/
,这是一个目录(的链接)。这些链接默认根据其现有的基本名称进行命名,src
在本例中就是如此。如果你第三次运行它,你会得到一个错误,因为../src/src
现在存在。
include/bb
您可以通过每次使用 时事先删除链接来避免这种情况rm include/bb
。分号与此无关。