创建后符号链接即破裂

59

我下载了Linux版Tor浏览器的安装包,它是一个自包含的文件夹。我创建了一个符号链接到运行脚本:

$ ln -s torbrowser/start-tor-browser ~/bin/torbrowser

然而,该链接在创建时已经失效。我所做的就是运行这个命令,没有其他操作,但它却失效了。我执行了ls命令并得到了以下结果:

lrwxrwxrwx 1 synful synful 28 Jul 18 21:52 torbrowser -> torbrowser/start-tor-browser

这很奇怪,因为torbrowser/start-tor-browser的权限是755。此外,我运行了file命令:

$ file ~/bin/torbrowser
bin/torbrowser: broken symbolic link to `torbrowser/start-tor-browser'

我创建了一个新的Bash脚本并为其创建了符号链接以进行测试,但没有出现这样的问题。我不确定为什么只有start-tor-browser会出现这种情况。它具有正常的权限,并且只是普通的Bash脚本(甚至根据file命令也是如此)。

...有任何想法吗?


2
在处理符号链接时,我总是使用绝对路径。几乎所有我的用例都与你的类似。 :) - Sudip Bhandari
5个回答

105

重要的是要知道

ln -s SOURCE TARGET

创建一个名为TARGET的符号链接,它与字符串SOURCE有符号链接关系。如果SOURCE是相对路径(即不以/开头),则解释相对于TARGET所在的目录。如果它是绝对路径,则为绝对路径。如果它是一个无法成为路径的字符串,或包含不存在的路径或文件,或者不是有效的路径字符串,那么也没有关系。ln -s 不检查SOURCE是否存在或是否有效。你可以在dirent中存储几乎任何短字符串。

因此,当您执行以下操作时:

$ ln -s torbrowser/start-tor-browser ~/bin/torbrowser
你正在做的大致是这样的:
  1. 在你的 bin 子目录中创建一个名为 torbrowser 的目录项。
  2. 将新的目录项作为符号链接(symlink)链接到路径 torbrowser/start-tor-browser(相对路径)。
新的符号链接是循环的。 ~/bin/torbrowser 链接到 ~/bin/torbrowser/start-tor-browser,这意味着你必须跟随符号链接才能解析符号链接。如果你尝试使用它,你会看到:
$ cat ~/bin/torbrowser
cat: /home/joshlf13/bin/torbrowser: Too many levels of symbolic links
$
有时候,甚至经常地,能够使用符号链接到相对路径非常方便。一个常见的用法是去除版本号:
$ ln -s apps/my_fancy_app_v2.63.1 apps/my_fancy_app

现在,我不仅可以调用my_fancy_app而不必记住其版本字符串,还可以将整个文件夹移动到别处,而不会破坏符号链接:

$ mv apps /usr/local/apps

但是有时候——就像你的例子一样,我认为——你需要将符号链接创建到绝对路径。

至于权限,符号链接始终具有lrwxrwxrwx权限,因为文件操作使用的实际权限是真实文件的权限。(您可以把它看作是任何人都可以跟随符号链接,但这并不完全正确:他们还需要读取任何需要跟随的目录的权限。更准确地说,任何能够看到符号链接的人都可以看到它所指向的名称,即使他们无法访问具有该名称的文件。)


4
为了避免链接失效,重要的是要输入完整路径。 - Lorenzo Lerate
1
绝对路径是解决我的问题的方法,但如果本地文件被正确引用,问题本不应该发生。 - theruss

24

在指定 TARGET 时,重要的是确保

ln -s TARGET LINK_NAME

是文件/目录的完整路径。 在我的情况下,当我进入目标目录并执行以下命令:

ln -s ./eclipse.ini ~/Desktop/eclipse1 结果是一个损坏的链接。

图片描述

但是当我执行以下命令 ln -s $(pwd)/eclipse.ini ~/Desktop/eclipse时,它可行!

图片描述


谢谢,这正是我想知道的。 - Nguyen Hoang Vu

1

针对ln的上面用法:

ln -s 源文件 目标文件

是正确的,但是在参考man手册时会令人困惑:

ln [选项]... [-T] 目标文件 链接文件名 (第一种形式)

因为'TARGET'有不同的含义。


1
与cp命令一致:cp existing new。同样地:ln -s existing new - Hrobky

0

我也曾经遇到过这个问题,创建后Linux符号链接会出现很多时间的中断,但解决方法很简单 - 就像rici所提到的那样:

如果源路径是相对路径(即不以/开头),则它将相对于目标所在的目录进行解释。

换句话说:

你有这些目录:

- my_directory
-- directory_1
- other_directory
-- *you want your directory_1 link here*

最简单的方法。进入“other_directory”。从那里开始就很简单:

ln -s ../my_directory/directory_1 directory_1

完成了 :)


0
注意:这也可能是由于权限问题引起的,例如如果您尝试执行以下命令:
sudo ln -s /home/somesuperuser/commonfile /home/somenormaluser/commonfile 这将无法正常工作,而应该使用其他方法。
sudo mv /home/somesuperuser/commonfile /usr/share/commonfile
sudo ln -s /usr/share/commonfile /home/somenormaluser/commonfile
sudo ln -s /usr/share/commonfile /home/somesuperuser/commonfile

有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接