我想要做的是运行一个进程,但因为这个进程依赖于环境变量,直接调用会导致进程内部发生错误。对于那些不知道它是什么的人来说,它是rake
工具。因此,我认为使用bash
可能更好,并且通过bash
使用可以消除问题。 然而,事实并非如此。
以下是我的代码:
public static void runPB(String directory) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder(
"/bin/bash");
processBuilder.directory(new File(directory));
Process process = processBuilder.start();
OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream());
osw.write("rake routes");
osw.close();
printStream(process.getErrorStream());
printStream(process.getInputStream());
}
public static void printStream(InputStream is) throws IOException {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
我知道这是一个与环境相关的问题,因为我在这里描述了错误cannot load such file -- bundler/setup (LoadError)。
此外,我检查了
processBuilder.environment()
返回的环境变量比输入的env
要少。我继续更改了osw.write()
行并尝试在那里使用echo $GEM_HOME
,但没有输出任何内容。如果我在我的操作系统的bash上执行此操作,则会输出路径。我还尝试了其他常见的事情,如echo $SHELL
,并且在Java代码和bash中都打印出了shell位置。所以我的问题是:
1)为什么我的操作系统环境变量与
ProcessBuilder.environment()
方法不同?2)
Process
类是否考虑使用由ProcessBuilder.environment()
提供的环境变量?如果是,那么我们如何添加缺少的操作系统级别的环境变量?
man 2 execve
。 - JiriS