我最近不得不从源代码编译程序(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
符号链接不应该从原始工作目录中执行文件吗?有没有办法让它发挥作用?
答案 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
相同的文件,显然文件不存在。
您有以下选项(按优先顺序排列):
/opt
并从那里调用/opt
中,并在/usr/local/bin
中创建一个调用原始可执行文件的小包装器shell脚本(请参阅本文末尾)。configure
脚本(例如--prefix=/usr/local
),以便它可以从/usr/local
开始工作。我建议不要选择3;我更喜欢让distus包管理器管理/usr
目录。如果我必须自己编译,我更喜欢将它放在/opt
下面的专用目录中。这样,如果我想稍后删除它,我可以删除该目录。
选项2的示例包装脚本:
#!/bin/bash
exec /opt/riak/bin/riak "$@"