我正在尝试从 shell 脚本调用我的 linux 可执行文件。在调用这个可执行文件之前,我想用特定的值设置 LD_LIBRARY_PATH。我的 shell 脚本如下:
Parent.sh(包含2行)
- source set_env.sh
- executable.so
设置环境.sh
- setenv LD_LIBRARY_PATH /proj/something
在从 linux 控制台手动执行 Parent.sh scipt 时,可执行文件 .so 会在正确设置 LD_LIBRARY_PATH 的情况下被调用。但是在将它与 java 代码集成为:
String[] commandArray ={"Parent.sh"};
Runtime runtime = Runtime.getRuntime();
Process javap = runtime.exec(commandArray);
javap.waitFor();
没有为可执行文件设置 LD_LIBRARY_PATH。所以
我希望描述清楚:)
请告知代码中的错误。
最佳答案
Dunes 答案可以解决您的问题,但我强烈建议在这种特殊情况下采用不同的方法。您应该在 Java 代码中执行此操作,而不是依赖 shell 来设置环境参数。这样您就不需要知道系统上存在哪些 shell 以及它们的语言是什么,它将适用于所有平台。
为此,您可以使用 Runtime.exec(String[] cmd, String[] environment)
重载 ( javadoc )。作为第二个参数,您可以传递一个数组,其中包含子进程将看到的所有环境变量。
甚至更好一点的是 ProcessBuilder
应用程序接口(interface):
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
变量集。
关于java - 无法为 Java 进程设置 LD_LIBRARY_PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8960499/