`ln --no-dereference` 应该做什么?

Ell*_*iew 3 ln

我正在刷新我对一些基本 GNU/Linux 命令的理解,我承认在过去的 20 多年里我从未真正完全理解这些命令。

$ man ln 部分说:

-n, --no-dereference
          treat LINK_NAME as a normal file if it is a symbolic link to a directory
Run Code Online (Sandbox Code Playgroud)

为了更好地理解这一点,我将其分解如下:

$ mkdir dir1
$ ln -vs dir1 dir2
'dir2' -> 'dir1'
$ mkdir dir3; touch dir3/xx

$ tree -F
.  
??? dir1/  
??? dir2 -> dir1/  
??? dir3/  
    ??? xx  

#Now to test -n, first as a hard link
$ ln -vn dir3/xx dir2
ln: failed to create hard link 'dir2': File exists

# and second as a symbolic link
$ ln -vsn dir3/xx dir2
ln: failed to create symbolic link 'dir2': File exists

# ??? why do these both fail ???
Run Code Online (Sandbox Code Playgroud)

只有 SYNOPSIS 中的第一个命令形式调用“LINK_NAME”,语法如下:

   ln [OPTION]... [-T] TARGET LINK_NAME
Run Code Online (Sandbox Code Playgroud)

所以这表示-n--no-dereference选项与 , 的第一个命令形式有关ln(而不是其他三个命令形式)。

在我的例子中:

TARGETdir3/xx,并且
LINK_NAMEdir2(“的符号链接的目录”)。

所以手册说,如果 LINK_NAME即记住这是我们应该创建的链接的名称)是“指向目录的符号链接”......

...然后我们假设将此符号链接视为“普通文件”。

我错过了什么?

Ste*_*itt 5

如果没有-n,您的两个ln命令都会在内部创建链接dir2:如果LINK_NAME存在并且是目录或指向目录的符号链接,则在目录内创建链接(如果可能)。

这就是-n这里的变化:ln不会被LINK_NAME视为目录(如果它是符号链接)。既然LINK_NAME已经存在,就ln失败了。添加-f将导致现有符号链接被替换:

ln -nsf dir3 dir2
Run Code Online (Sandbox Code Playgroud)

将替换dir2而不是在里面创建链接dir2