【问题标题】:Symlink broken right after creation符号链接在创建后立即断开
【发布时间】:2013-07-18 04:57:19
【问题描述】:

我下载了 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 命令)。

...有什么想法吗?

【问题讨论】:

  • 我在处理符号链接时总是使用绝对路径。几乎我所有的用例都与你的相似。 :)

标签: bash relative-path symlink absolute-path


【解决方案1】:

知道这一点很重要

ln -s SOURCE TARGET

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

所以当你这样做时:

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

你正在做的大致是:

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

【讨论】:

  • 放置完整路径很重要,以免链接失效
  • 绝对路径为我解决了这个问题,但是正确引用的本地文件也不应该出现问题..
【解决方案2】:

您在

中指定的TARGET 很重要
ln -s TARGET LINK_NAME

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

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

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

【讨论】:

  • 谢谢,这才是我真正想知道的
【解决方案3】:

上面给出的ln用法:

ln -s 源目标

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

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

因为'TARGET'有不同的含义

【讨论】:

  • 与cp一致:cp existing new。同样:ln -s existing new
【解决方案4】:

注意:这也可能由于权限而发生 例如。如果你尝试

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

有效

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 2020-02-07
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多