无法从 /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
相同的文件,显然该文件不存在。
您有以下选项(按优先顺序排列):
- 将程序留在
/opt
中并从那里调用它
- 将程序保留在
/opt
中,并在 /usr/local/bin
中创建一个小包装 shell 脚本来调用原始可执行文件(请参阅本 post 的末尾)。
- 重新编译程序,将正确的参数传递给它的
configure
脚本(例如 --prefix=/usr/local
),以便它可以从 /usr/local
. 运行
我不推荐选项 3;我更喜欢让 /usr
目录由 distos 包管理器管理。如果我必须自己编译一些东西,我更愿意将它放在下面的专用目录中 /opt
。这样,如果我以后想删除它,我可以删除那个目录。
选项 2 的包装脚本示例:
#!/bin/bash
exec /opt/riak/bin/riak "$@"
我最近不得不从源代码编译一个程序 (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
相同的文件,显然该文件不存在。
您有以下选项(按优先顺序排列):
- 将程序留在
/opt
中并从那里调用它 - 将程序保留在
/opt
中,并在/usr/local/bin
中创建一个小包装 shell 脚本来调用原始可执行文件(请参阅本 post 的末尾)。 - 重新编译程序,将正确的参数传递给它的
configure
脚本(例如--prefix=/usr/local
),以便它可以从/usr/local
. 运行
我不推荐选项 3;我更喜欢让 /usr
目录由 distos 包管理器管理。如果我必须自己编译一些东西,我更愿意将它放在下面的专用目录中 /opt
。这样,如果我以后想删除它,我可以删除那个目录。
选项 2 的包装脚本示例:
#!/bin/bash
exec /opt/riak/bin/riak "$@"