我正在刷新对一些基本 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 ???
只有概要中的第一个命令形式调用“LINK_NAME”,语法如下:
ln [OPTION]... [-T] TARGET LINK_NAME
所以这表示-n
和--no-dereference
选项仅有的与 , 的第一个命令形式相关ln
(而不是其他三个命令形式)。
在我的例子中:
这目标是dir3/xx
,
并且LINK_NAME是dir2
('目录的符号链接')。
手册上说如果LINK_NAME(即记住这是我们要创建的链接的名称) 是 '目录的符号链接'...
...那么我们应该将此符号链接视为“普通文件'。
我缺少什么?
答案1
如果没有-n
,您的两个ln
命令都会在 内部创建链接dir2
:如果LINK_NAME
存在并且是目录或目录的符号链接,则在目录内部创建链接(如果可能)。
这就是-n
这里的变化:ln
不会被视为LINK_NAME
目录(如果它是符号链接)。由于LINK_NAME
已经存在,ln
失败。添加-f
将导致现有的符号链接被替换:
ln -nsf dir3 dir2
将替换dir2
而不是在内部创建链接dir2
。