我在用着
ln -f -s /var/www/html/releases/build1390 app-current
用新目标更新符号链接“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
不使用 strace -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