我已经安装了一个 ruby 应用程序,/home/anp/tools
然后创建了一个符号链接,如下所示:
ln -s /home/anp/tools/wwan /usr/bin/wwan
如果我执行~/tools/wwan
,它运行得很好。
如果我尝试从符号链接运行它,我会收到一条错误消息
无法加载此类文件 — lib/wwan
这难道不能按原样工作吗?当程序尝试解析相对文件路径时,符号链接是否会导致问题?
答案1
当程序尝试解析相对文件路径时,符号链接是否会导致问题?
有可能。在这种情况下,很有可能是这样的。
运行时可能出现的情况~/tools/wwan
:
- 外壳膨胀起来
~
,你就真的跑了/home/anp/tools/wwan
。 - 工具启动了。它知道它正在启动
/home/anp/tools/wwan
(例如,因为argv[0]
)。 - 该工具找到上述字符串的目录部分并将其自己的工作目录更改为该目录:
/home/anp/tools/
。 - 该工具通过相对路径引用了附加资产:
lib/wwan
。该资产确实在中/home/anp/tools/lib/wwan
,因此它可以正常工作。
但是当您运行/usr/bin/wwan
或wwan
(/usr/bin
在 中$PATH
)时,场景以 开始/usr/bin/wwan
并以 结束,/usr/bin/lib/wwan
而 不存在文件。资产不存在。
细节可能有所不同,但符号链接的这种问题表明该工具没有在应该取消引用链接时取消引用链接。如果是这样,它总是可以正常工作,/home/anp/tools/wwan
就像您运行一样/home/anp/tools/wwan
。我想说您遇到的是一个错误。
解决此问题的一种方法是改进工具本身(编辑其代码),以便它能够正确找到其真实路径。
另一种方法是使用包装脚本而不是符号链接。删除符号链接并创建名为 的脚本/usr/bin/wwan
。脚本内容:
#!/bin/sh
exec /home/anp/tools/wwan "$@"
使其可执行。现在,如果您调用/usr/bin/wwan
,脚本将为exec
,/home/anp/tools/wwan
这将是该工具将使用的字符串,因此它应该可以工作。由于,您提供的所有(零个或多个)参数/usr/bin/wwan
都将传递给。/home/anp/tools/wwan
"$@"
笔记:
/usr/bin/
是可执行文件的系统范围位置。从那里链接到位于主目录中的工具通常不是一个好习惯;包装也是如此。- 包装器脚本是一个单独的常规文件。其所有权和权限与目标可执行文件的所有权和权限无关。请正确设置它们。