更准确地说:我知道这些-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
如果后者已经存在,将创建一个名为project
inside 的链接。/var/www/html/project
-T
消除歧义,并强制ln
仅考虑第一种形式:如果链接不存在,则按指定名称创建链接;如果已经存在具有给定的文件或目录LINK_NAME
,ln
则会失败并出现错误(除非-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