符号链接在perl中是否覆盖了现有链接



我正在尝试模仿Unix命令

ln -sf /path/to/file /path/to/link

通过使用 Perl

symlink (/path/to/file /path/to/link) 

Perl 是否删除了现有的目标文件并创建了类似于 -s -f 选项的符号链接?

symlink只是用相同的名称(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
...

这很容易弄清楚。让我们试穿一下

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: $!"'

它打印

无法成功:文件存在于 -e 行 1 处。

我检查具有相同索引节点编号的原始文件(链接(是否仍然存在。

因此,不,它不会覆盖现有文件。

符号链接的页面表明没有选项可以force。

最新更新