如何将具有依赖目录的程序添加到 $PATH?

如何将具有依赖目录的程序添加到 $PATH?

我想向我的 中添加一个程序$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变量只会被被调用的进程继承,不会污染调用环境。)

相关内容