我正在刷新我对一些基本 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(而不是其他三个命令形式)。
在我的例子中:
该TARGET是dir3/xx,并且
该LINK_NAME是dir2(“的符号链接的目录”)。
所以手册说,如果 LINK_NAME(即记住这是我们应该创建的链接的名称)是“指向目录的符号链接”......
...然后我们假设将此符号链接视为“普通文件”。
我错过了什么?
如果没有-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。