在 Java 中,我需要在 macOS 上执行用户安装的命令(我们称之为
abc
)。然而跑步时
Runtime.getRuntime().exec(new String[] {"abc", "--argument"});
找不到它,因为 Java 似乎继承了有限的系统 $PATH(它在从系统 shell 调用它时起作用)。我想通了
Runtime.getRuntime().exec(new String[] {"sh", "-c", "$SHELL -c 'abc --argument'"});
适用于我的设备(使用 zsh 和 Fish 作为 shell 进行测试)。但是,在将 bash 设置为系统 shell 的其他设备上,无法找到它。我希望调用
$SHELL
能够加载登录路径。
这两个都不起作用:
Runtime.getRuntime().exec(cmd);
processBuilder.start();
从 Java 运行系统 $PATH 中的命令的正确方法是什么?
如果您正在寻找
$PATH
的每用户定制,那么您也许可以这样做:
/* Contents of named file in /tmp are:
export PATH=/opt/lib:$PATH
*/
public class PathExtender {
public static void main(String[] args) throws Exception {
final String[] cmdAddToPath = {
"/bin/bash",
"-c",
"source /tmp/add-to-path && echo $PATH"
};
new ProcessBuilder(cmdAddToPath).inheritIO().start();
}
}
/opt/lib
的路径现在为我添加到$PATH
前面