'ln -sT' 在 Linux 中是什么意思?

man*_*tor 0 symlink ln

更准确地说:我知道这些-s选项代表什么——我每天都在使用它。但是我在教程中看到有人将其网站的文档根目录从/var/www/html/project移到~/www/project以提高安全性(他后来更改了权限等,但在这种情况下并不重要)。然后他创建了以下符号链接:

ln -sT ~/www/project /var/www/html/project
Run Code Online (Sandbox Code Playgroud)

我想知道这-T是做什么用的,因为通常我会使用-s. 从手册页中,我获得了有关该-T选项的以下稀疏信息:

-T, --no-target-directory
     treat LINK_NAME as a normal file always
Run Code Online (Sandbox Code Playgroud)

我真的不明白这是为了什么。创建符号链接时为什么要-T结合使用-s?这样做有什么好处吗?

Ste*_*itt 6

ln的梗概如下:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
Run Code Online (Sandbox Code Playgroud)

如果没有-T,如果LINK_NAME已经存在并且是一个目录(或经过验证以最终解析为目录的符号链接),则第一种和第三种形式是不明确的,并ln选择第三种形式:它在目录创建链接。因此

ln -s ~/www/project /var/www/html/project
Run Code Online (Sandbox Code Playgroud)

如果后者已经存在,将创建一个名为projectinside的链接/var/www/html/project

-T消除歧义,并强制ln仅考虑第一种形式:如果链接不存在,则以命名链接的形式创建;如果已经有一个文件或目录与给定的LINK_NAMEln因错误而失败(除非-f指定太)。

所以

ln -sT ~/www/project /var/www/html/project
Run Code Online (Sandbox Code Playgroud)

保证您最终得到/var/www/html/project指向的链接~/www/project或错误消息(和非零退出代码)。