51

我下载了 linux Tor Browser 包,这是一个独立的文件夹。我为运行脚本创建了一个符号链接:

$ 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 命令)。

...有任何想法吗?

4

4 回答 4

88

重要的是要知道

ln -s SOURCE TARGET

创建一个名为 TARGET 的符号链接,它以符号方式链接到字符串 SOURCE。如果SOURCE是相对路径(即不以 开头/),则相对于所在目录进行解释TARGET。如果是绝对路径,则为绝对路径。如果它是一个不能作为路径的字符串,或者包含不存在的路径或文件,或者不是有效的路径字符串,则无论如何。ln -s不检查 SOURCE 是否存在甚至是有效路径。您几乎可以将所需的任何短字符串存储在 dirent 中。

所以当你这样做时:

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

你正在做的是,大致:

  1. 在您的子目录中创建一个目录条目binname torbrowser
  2. 使该新目录条目成为(相对)路径的符号链接(符号链接)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因为文件操作使用的实际权限是对真实文件的权限。(您可以认为这意味着任何人都可以关注符号链接,但这并不完全正确:他们还需要对他们需要关注的任何目录的读取权限。更准确地说,任何可以看到符号链接的人都可以看到它的名称指向,即使他们无权访问具有该名称的文件。

于 2013-07-19T05:33:41.930 回答
18

TARGET

ln -s TARGET LINK_NAME

是文件/目录的完整路径。我遇到了这个问题,就我而言,当我cd进入目标目录并做了

ln -s ./eclipse.ini ~/Desktop/eclipse1导致链接断开

在此处输入图像描述

但是当我这样做时ln -s $(pwd)/eclipse.ini ~/Desktop/eclipse它起作用了!

在此处输入图像描述

于 2019-08-27T15:15:28.847 回答
1

上面给出的 ln 用法:

ln -s 源目标

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

ln [OPTION]... [-T] TARGET LINK_NAME(第一种形式)

因为“目标”有不同的含义

于 2015-01-06T08:15:19.137 回答
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

确实有效

于 2020-02-12T14:54:23.227 回答