无法从/ usr / local / bin / symlink

时间:2016-09-01 08:58:20

标签: linux path 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

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

1 个答案:

答案 0 :(得分:0)

错误消息几乎是自我解释的。显然,riak可执行文件正在尝试使用相对于其自身的路径env.sh来查找名为../lib/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脚本(请参阅本文末尾)。
  3. 将通过正确参数的程序重新编译到其configure脚本(例如--prefix=/usr/local),以便它可以从/usr/local开始工作。
  4. 我建议不要选择3;我更喜欢让distus包管理器管理/usr目录。如果我必须自己编译,我更喜欢将它放在/opt下面的专用目录中。这样,如果我想稍后删除它,我可以删除该目录。

    选项2的示例包装脚本:

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