我正在刷新我对一些基本 GNU/Linux 命令的理解,我承认在过去的 20 多年里我从未真正完全理解过这些命令。
$ man ln
部分说:
-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a directory
为了更好地理解这一点,我将其分解如下:
$ 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 ???
只有 SYNOPSIS 中的第一个命令形式调用了“LINK_NAME”,语法如下:
ln [OPTION]... [-T] TARGET LINK_NAME
所以这表示-n
and--no-dereference
选项仅与 , 的第一个命令形式有关ln
(而不是其他三种命令形式)。
在我的例子中:
TARGET是,dir3/xx
LINK_NAME
是( 'a symbolic link to a directory') 。dir2
手册说如果 LINK_NAME(即记住这是我们应该创建的链接的名称)是“指向目录的符号链接”......
...那么我们应该将此符号链接视为“普通文件”。
我错过了什么?
如果没有
-n
,您的两个ln
命令都会在dir2
: 内创建链接,如果LINK_NAME
存在并且是目录或目录的符号链接,则在目录内创建链接(如果可能)。这就是
-n
这里的变化:ln
不会被LINK_NAME
视为目录(如果它是符号链接)。由于LINK_NAME
已经存在,ln
失败。添加-f
将导致现有的符号链接被替换:将替换
dir2
而不是在内部创建链接dir2
。