linux - 无法从/usr/local/bin/symlink 执行

标签 linux path symlink

我最近不得不从源代码编译一个程序 (Riak),因为他们还没有适用于 Ubuntu 16.04 的存储库。

我已经编译了程序并将其复制到/opt/riak,它运行良好。

由于该程序需要 sudo 权限,我决定将/opt/riak/bin/riak 符号链接(symbolic link)到/usr/local/bin/riak,而不是通过 profile.d 文件将变量添加到路径(因为在为了与 sudo 一起工作,我必须从/etc/sudoers 中删除 env_reset,我宁愿不这样做。

我得到的错误如下: /usr/local/bin/riak: 8: .: 无法打开/usr/local/bin/../lib/env.sh

符号链接(symbolic link)不应该从原始工作目录执行文件吗?有没有办法让它发挥作用?

最佳答案

错误消息几乎是不言自明的。显然,riak 可执行文件正在尝试使用相对于其自身的路径查找名为 env.sh 的文件,即 ../lib/env.sh。最初,这将解析为以下路径:/opt/riak/bin/../lib/env.sh,与 /opt/riak/lib/env 相同。嘘。但是现在正试图在 /usr/local/bin/../lib/env.sh 中找到该文件,它与 /usr/local/lib/env.sh 显然文件不存在。

您有以下选项(按优先顺序排列):

  1. 将程序留在 /opt 中并从那里调用它
  2. 将程序留在 /opt 中,并在 /usr/local/bin 中创建一个小的包装器 shell 脚本来调用原始可执行文件(请参阅本文末尾) ).
  3. 重新编译程序,将正确的参数传递给它的 configure 脚本(例如 --prefix=/usr/local),以便它从 /usr/开始工作本地

我不推荐选项 3;我更喜欢让 /usr 目录由 distos 包管理器管理。如果我必须自己编译一些东西,我更愿意将它放在 /opt 下的专用目录中。这样,如果以后想删除它,只需删除该目录即可。

选项 2 的包装脚本示例:

#!/bin/bash
exec /opt/riak/bin/riak "$@"

关于linux - 无法从/usr/local/bin/symlink 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39267045/

相关文章:

macos - 获取放置在脚本上的文件的文件名

linux - rsync 到带有非法文件名的 Windows 共享

javascript - 清除 HTML5 Canvas 中的笔划路径(在循环内)

linux - 如何在 cron 中安排每月第 8 个工作日运行的作业

python - 更改 Spyder for Python 中的 "wdir"选项

.net - WPF 的 BitmapCache 未完全清除

symlink - 如何获取 Perl 6 中符号链接(symbolic link)的目标?

linux - 在与符号链接(symbolic link)同名的目录中提取符号链接(symbolic link) zip 文件的内容

linux - bash命令行中用双引号括起来的字符串cmd

linux - 如何使用grep -e 来匹配部分单词?