使用 ln -f -s 时会创建递归符号链接

使用 ln -f -s 时会创建递归符号链接

如果我在当前文件夹中创建一个文件夹,则说日志:-

mkdir log
ln -s -f log all_logs

这样 all_logs 就指向日志目录。

ls -ltr
Jan  7 23:33 log
Jan  7 23:33 all_logs -> log

当我ln -s -f log all_logs再次运行时,会创建一个递归符号链接里面日志目录,名为log。

ls -ltr log/
Jan  7 23:33 log -> log

为什么会发生这种情况? 现有的符号链接难道不应该只取消链接并重新链接(使用 -f 选项)吗? 为什么会发生这种递归行为?

答案1

现有的符号链接不应该只被取消链接并重新链接吗?

不是。该命令正在将现有链接解析为目录目标,log/.

符号链接不是文件。例如:

# touch test
# mkdir testdir
# ln -s -f testdir test
# ls -l
Jan  7 11:28  test -> testdir

如果链接目标是已经存在的文件,它将被-f的选项覆盖ln

如果您想在 GNU 上覆盖此行为ln,请使用-T选项ln,即“始终将 LINK_NAME 视为普通文件”。

如果在 BSD 上ln,使用-h,即“如果 target_file 或 target_dir 是符号链接,则不要遵循它。”

答案2

从手册中提取(对于mv和来说是相同的cp,尽管它们没有第二种形式)。

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME
       ln [OPTION]... TARGET
       ln [OPTION]... TARGET... DIRECTORY
       ln [OPTION]... -t DIRECTORY TARGET...

请注意,第一种形式和第三种形式(当给定 2 个参数时)是模棱两可的。因此,为了避免模棱两可:写入目录时使用第四种形式,和/或附加/到目录名称。使用第一种形式时(因为没有指定目录),请使用选项-T。不幸的是,并非所有人都可以使用,因此会发生错误(认为会发生意外)。这种情况-h可以在 BSD 上使用,或者-n效果相同,但可以在 BSD 和 GNU 上使用。

相关内容