我在用著
ln -f -s /var/www/html/releases/build1390 應用程式目前
使用新目的地更新符號連結“app-current”。但是,這不起作用,連結“app-current”保留其原始目的地,但是,我沒有收到任何錯誤...
我不想刪除連結並重新建立它,而只是更新現有連結的目標。那可能嗎?
答案1
這對我有用,輸出是什麼strace ln -f -s /var/www/html/releases/build1390 app-current
?
哦,因為它是一個目錄,您需要添加它-n
才能取消引用,這應該可以解決問題。-f
確實更方便,因為添加 -f 只會導致它無論如何都取消連結。儘管我猜想在正常加載的系統上它可能會快幾百毫秒。
例如,如果 arf 已經指向 /home:
strace 與-n
:
strace ln -n -f -s / arf
...
symlink("/", "arf") = -1 EEXIST (File exists)
unlink("arf") = 0
symlink("/", "arf") = 0
沒有-n
:
strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: ) = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1) = 1
因此,如果沒有-n
arf,就會取消引用,因此ln將其視為arf,就好像它實際上是一樣/
。在您的特定示例中,如果沒有錯誤,我認為您可能在其中創建了一個新的符號鏈接,/var/www/html/releases/build1390 app-current
並且想要清理它。
答案2
如果目標是符號鏈接,則可以使用-n
或--no-dereference
來防止目標被取消引用。您也可以使用-T
或--no-target-directory
來確保目標文件將總是被視為常規文件。
這些會產生略有不同的行為,如下例所示。假設src
是某個文件,dirlink
是目錄的符號鏈接,並且dir
是實際目錄。
使用-n
:
ln -sfn src dirlink
覆蓋dirlink
並將其連結到src
ln -sfn src dir
建立連結dir/src -> src
使用-T
:
ln -sfT src dirlink
覆蓋dirlink
並將其連結到src
ln -sfT src dir
產生錯誤訊息:ln: ‘dir’: cannot overwrite directory