无法从 /usr/local/bin/ 符号链接执行

Can't execute from /usr/local/bin/ symlink

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

我编译了程序并将其复制到 /opt/riak 那里运行良好。

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

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

符号链接不应该从原始工作目录执行文件吗?有什么办法让它起作用吗?

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

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

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

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

选项 2 的包装脚本示例:

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