gpt4 book ai didi

java - 使用 processbuilder 加载所有环境变量

转载 作者:行者123 更新时间:2023-11-29 09:39:15 27 4
gpt4 key购买 nike

我想在从 Java 代码执行脚本之前加载我在 .bashrc 文件中定义的变量。该脚本通过 ProcessBuilder 执行。在网络上,我看到命令数组应该以 bash -c 开头,如下所示:

String[] cmdline = {"/bin/bash", "-c", "python", "/home/mahmood/temp.py"};
final ProcessBuilder pb = new ProcessBuilder(cmdline);
pb.command(cmdline);
pb.redirectOutput(Redirect.INHERIT);
final Process p = pb.start();
int exitCode = p.waitFor();
if (exitCode != 0) {
throw new IOException("... python failed :( \n");
}

确实 waitFor 永远不会返回!如果我删除 bash -c,则 exitCode 将为非零,因为尚未加载变量。

请注意,.bashrc 中没有单个变量。我可以使用 ProcessBuilder 解决问题还是有更好的选择?

最佳答案

Bash 必须作为交互式 shell 调用read and execute commands from ~/.bashrc .运行 bash -c command 时,您正在非交互式 shell 中执行 command。要交互式运行(并阅读 .bashrc),只需添加 -i:

String[] cmdline = {"/bin/bash", "-ic", "python /home/mahmood/temp.py"};

此外,请注意命令字符串 (python/path/to/file) 必须指定为单个单词(从 shell 调用时请注意单引号) :

bash -ic 'python /home/mahmood/temp.py'

否则,bash 将执行 python(第一个词)交互(不运行脚本)——这就是您的原因waitFor 永远不会返回。


由于运行交互式 shell 只是为了从 .bashrc 加载一些环境变量可能有点矫枉过正,您可以在单独的文件中提取感兴趣的变量,例如:

export var1=val1
export var2='val 2'
...

然后在运行您的python 脚本之前获取该文件:

String[] cmdline = {"/bin/bash", "-c", ". /path/to/envfile; python /home/mahmood/temp.py"};

关于java - 使用 processbuilder 加载所有环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47433558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com