2017-08-25 76 views

回答

5

symlink只是簡單地調用相同名稱的OS調用(symlink(2)),當「newpath已存在」時返回錯誤EEXIST

如果你想實現-f,你可以使用

unlink($new_qfn); 
symlink($old_qfn, $new_qfn) 
    or die("Can't create symlink \"$new_qfn\": $!\n"); 

但是,下列情況處理競爭條件更好的工作:

if (!symlink($old_qfn, $new_qfn)) { 
    if ($!{EEXIST}) { 
     unlink($new_qfn) 
     or die("Can't remove \"$new_qfn\": $!\n"); 
     symlink($old_qfn, $new_qfn) 
     or die("Can't create symlink \"$new_qfn\": $!\n"); 
    } else { 
     die("Can't create symlink \"$new_qfn\": $!\n"); 
    } 
} 

ln採用後一種方法。

$ strace ln -sf a b 
... 
symlink("a", "b")      = -1 EEXIST (File exists) 
unlink("b")        = 0 
symlink("a", "b")      = 0 
... 
+0

這是一個很好的答案。謝謝! – pmsuresh

2

這很容易弄清楚你自己。讓我們來試試

ls -li link_to_FILE.txt 
# 2415940160 lrwxrwxrwx. ... link_to_FILE.txt -> FILE.txt 

perl -wE'symlink "FILE.txt", "link_to_FILE.txt" or warn "Cant make it: $!"' 

它打印

 
Cant make it: File exists at -e line 1. 

,我檢查原始文件(鏈接)具有相同的inode編號仍然存在。

所以,不,它不會覆蓋現有的文件。

symlink的頁面表示沒有選項f orce那。

+0

您可以先強制取消目標符號鏈接名稱。 – mob

+0

@mob,'symlink' +'rm' +'symlink'在處理常見情況下的競爭條件方面做得更好。這是'ln'使用的。 – ikegami