无法为Java进程设置LD_LIBRARY_PATH

我想从shell脚本中调用我的linux可执行文件。 在调用这个可执行文件之前,我想用特定的值来设置LD_LIBRARY_PATH。 我的shell脚本如下:

Parent.sh(包含2行)

- source set_env.sh - executable.so 

Set_env.sh

  - setenv LD_LIBRARY_PATH /proj/something 

在从Linux控制台手动执行Parent.sh scipt时,将正确调用LD_LIBRARY_PATH来调用executable.so。 但是将它与java代码整合为:

 String[] commandArray ={"Parent.sh"}; Runtime runtime = Runtime.getRuntime(); Process javap = runtime.exec(commandArray); javap.waitFor(); 

LD_LIBRARY_PATH未设置为可执行文件

我希望说明是明确的:)

请让代码中知道最新错误。

Solutions Collecting From Web of "无法为Java进程设置LD_LIBRARY_PATH"

沙丘答案解决了你的问题,但我强烈建议在这种特殊情况下采用不同的方法。 不要依赖shell来设置环境参数,而应该在Java代码中执行此操作。 这样你就不需要知道系统上有哪些shell以及它们的语言是什么,它只能在所有平台上运行。

为此,可以使用Runtime.exec(String[] cmd, String[] environment)重载( javadoc )。 作为第二个参数,你可以传递一个包含子进程将会看到的所有环境变量的数组。

ProcessBuilder API甚至更好一些:

 ProcessBuilder pb = new ProcessBuilder("executable.so"); Map<String, String> env = pb.environment(); env.put("LD_LIBRARY_PATH", "/proj/something"); Process javap = pb.start(); javap.waitFor(); 

这样,子进程将继承Java进程的所有环境变量,并且还有LD_LIBRARY_PATH变量集。

你确定子进程使用csh吗? 如果它启动使用bash或其他东西,那么这将阻止脚本工作(但不是抛出一个IOException)。

你应该在脚本的第一行添加一个hashbang行来表明你希望使用哪个shell解释器。

例如。

 #!/usr/bin/env csh