Ln

ln --no-dereference 應該做什麼?

  • November 12, 2021

我正在刷新我對一些基本 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

所以這表示-nand--no-dereference選項與 , 的第一個命令形式有關ln(而不是其他三種命令形式)。

在我的例子中:

TARGET是,dir3/xxLINK_NAME

是( ‘a symbolic link to a directory’) dir2

手冊說如果 LINK_NAME即記住這是我們應該創建的連結的名稱)是“指向目錄的符號連結”……

…那麼我們應該將此符號連結視為“普通文件”。

我錯過了什麼?

如果沒有-n,您的兩個ln命令都會在dir2: 內創建連結,如果LINK_NAME存在並且是目錄或目錄的符號連結,則在目錄內創建連結(如果可能)。

這就是-n這裡的變化:ln不會被LINK_NAME視為目錄(如果它是符號連結)。由於LINK_NAME已經存在,ln失敗。添加-f將導致現有的符號連結被替換:

ln -nsf dir3 dir2

將替換dir2而不是在內部創建連結dir2

引用自:https://unix.stackexchange.com/questions/561135