无法为Java进程设置LD_LIBRARY_路径

无法为Java进程设置LD_LIBRARY_路径,java,linux,dll,csh,Java,Linux,Dll,Csh,我正在尝试从shell脚本调用我的linux可执行文件。在调用此可执行文件之前,我想用特定值设置LD_LIBRARY_PATH。我的shell脚本如下所示: Parent.sh(包含2行) Set_env.sh - setenv LD_LIBRARY_PATH /proj/something 在从linux控制台手动执行Parent.sh scipt时,将调用可执行文件.so,并正确设置LD_LIBRARY_路径。但在将其与java代码集成为: String[] commandArray

我正在尝试从shell脚本调用我的linux可执行文件。在调用此可执行文件之前,我想用特定值设置LD_LIBRARY_PATH。我的shell脚本如下所示:

Parent.sh(包含2行)

Set_env.sh

   - setenv LD_LIBRARY_PATH /proj/something
在从linux控制台手动执行Parent.sh scipt时,将调用可执行文件.so,并正确设置LD_LIBRARY_路径。但在将其与java代码集成为:

String[] commandArray ={"Parent.sh"};
Runtime runtime = Runtime.getRuntime();
Process javap = runtime.exec(commandArray);
javap.waitFor();
未为可执行文件设置LD_LIBRARY_路径。因此

我希望描述清楚:)


请告知代码中有什么错误。

您确定子流程正在使用csh吗?如果它使用bash或其他东西启动,那么这将阻止脚本工作(但不会引发IOException)

实际上,您应该在脚本的第一行添加hashbang行,以说明希望使用哪个shell解释器

例如


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

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

API甚至有一点更好:

ProcessBuilder pb=newprocessbuilder(“executable.so”);
Map env=pb.environment();
环境放置(“LD_LIBRARY_PATH”,“/proj/something”);
进程javap=pb.start();
javap.waitFor();

这样,子进程将继承Java进程中的所有环境变量,并另外设置
LD\u LIBRARY\u PATH
变量。

非常感谢。。。第一枪就成功了。。太神了是的,目前我正在csh上测试。请告诉我如何在java运行时检查当前运行的lunux上可用的shell解释器,以便我可以在运行时修改这个.sh文件。为LD_LIBRARY_PATH添加了环境数组,并且工作正常。现在我一点也不依赖于shell iTerproters。感谢Dune和Philipp提供了宝贵的答案,这些答案花了6-7个小时进行调试,但无法完成。非常感谢亲爱的提问+1投票
String[] commandArray ={"Parent.sh"};
Runtime runtime = Runtime.getRuntime();
Process javap = runtime.exec(commandArray);
javap.waitFor();
#!/usr/bin/env csh
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();