我想向我的 中添加一个程序$PATH
,但它的代码被分成多个文件,并在运行时从其lib/
根目录中导入。
projectRootDirectory
├ programBinary
└ lib
├ someLibrary
└ someLibrary2
如何将这样的程序添加到我的程序中$PATH
而不抱怨缺少依赖项?
我通常会将二进制文件/usr/local/bin
放入
复制
cp /path/to/programBinary /usr/local/bin
或符号链接
cd /usr/local/bin ln -s /path/to/programBinary programBinary
但两者都使它无法找到其依赖项。
我无法将整个目录移入,/usr/local/bin
因为某些必需的文件也是可执行文件,我不想让我的$PATH
.
我应该怎么做?
答案1
您当然可以添加projectRootDirectory
到您的$PATH
,但这至少有两个缺点:
看起来,按照您描述的方式,这个特定项目没有很好地将其项目组织到
bin
子目录中lib
,如下所示:projectRootDirectory ├ bin │ └ programBinary └ lib ├ someLibrary └ someLibrary2
因此,您将被迫将
projectRootDirectory
其自身放入$PATH
,并且由于除了用于执行的二进制文件之外还包含其他内容,因此它有点丑陋。如果你有很多类似的项目,你的内容
$PATH
就会激增并失去控制。
相反,在这种特殊情况下,您可能可以做的最简单的事情就是在 中放置一个包装器可执行文件/usr/local/bin
,这是一个非常简单的 shell 脚本,只从它所在的位置运行“真实”程序。
#!/bin/sh
exec projectRootDirectory/programBinary "$@"
由于包装器脚本使用其完整路径名调用它,因此它可能能够以通常的方式找到其辅助文件。
答案2
有许多不同复杂程度的方法可以解决这个问题,最适合的方法取决于您的“包装哲学”。
我可能选择的方法是在您的/usr/local/bin
目录中放置一个包装器脚本,该脚本除了设置导出的变量(由您的库路径修改)之外什么也不做PATH
,并在您的库路径中调用主程序;在这种情况下,所有可执行文件都将驻留在您的 lib 目录中,只有/usr/local/bin
. (本地定义的PATH
变量只会被被调用的进程继承,不会污染调用环境。)