Linux 中“ln -sT”的含义是什么?

Linux 中“ln -sT”的含义是什么?

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

ln -sT ~/www/project /var/www/html/project

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

-T, --no-target-directory
     treat LINK_NAME as a normal file always

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

答案1

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)

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

ln -s ~/www/project /var/www/html/project

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

-T消除歧义,并强制ln仅考虑第一种形式:如果链接不存在,则按指定名称创建链接;如果已经存在具有给定的文件或目录LINK_NAMEln则会失败并出现错误(除非-f也指定了)。

所以

ln -sT ~/www/project /var/www/html/project

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

答案2

它确保您的路径(在您的示例中/var/www/html/project)是最终路径,因此链接将 100% 存在,如果存在/var/www/html/project则不存在.../var/www/html/project/**project**/var/www/html/project

因为这可能会令人困惑,所以展示差异的例子

设置: cd /tmp; mkdir /tmp/aa; mkdir /tmp/bb;

ln -s /tmp/aa /tmp/bb将产生新的符号链接/tmp/bb/aa -> /tmp/aa

然而

ln -sT /tmp/aa /tmp/bb将导致ln: failed to create symbolic link '/tmp/bb': File exists

-s参数与它无关。它(像往常一样)在文档中进行了解释:https://www.gnu.org/software/coreutils/manual/html_node/Target-directory.html

相关内容