如何从Java运行Homebrew或MacPorts安装的工具


  • 我正在尝试用Java在MacOS上实现一些自动化
  • 从终端手动运行命令时没有问题
  • 我想是因为<user.home>/.zprofile
  • 尝试通过ProcessBuilder执行命令时找不到这些命令

如何在与手动运行zsh终端相同的环境中执行命令?

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) throws Exception {
// these commands work
run("/bin/sh", "-c", "echo $PATH");
run("/bin/bash", "-c", "echo $PATH");
run("/bin/zsh", "-c", "echo $PATH");
// these commands all work when I run them manually in a terminal
// but fail here with "zsh:1: command not found: ..."
run("/bin/zsh", "-c", "node -v");
run("/bin/zsh", "-c", "npm -v");
}
private static void run(String... command) throws Exception {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.redirectErrorStream(true);
processBuilder.command(command);
Process process = processBuilder.start();
try(BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
for(String line = br.readLine(); line != null; line = br.readLine()) {
System.out.println(line);
}
}
System.out.println("return value: " + process.waitFor());
}
}

输出:

/usr/bin:/bin:/usr/sbin:/sbin
return value: 0
/usr/bin:/bin:/usr/sbin:/sbin
return value: 0
/usr/bin:/bin:/usr/sbin:/sbin
return value: 0
zsh:1: command not found: node
return value: 127
zsh:1: command not found: npm
return value: 127

在阅读了太多关于shell的文章并研究了shell初始化图之后,我决定使用Zsh。

原因是这篇博客文章,它表明Zsh似乎至少有一个init文件,该文件针对所有可能的shell变体(登录、非登录、交互式、非交互式等(执行。

我将所有环境设置(PATH和LANG(移到了/etc/zshenv,删除了/etc/zprofile和所有~/.z*文件。

我还将root和我的用户的shell都更改为Zsh(对于用户来说,这也可以通过系统首选项完成(:

dscl . -delete /Users/root UserShell && dscl . -create /Users/root UserShell /bin/zsh && dscl . -read /Users/root UserShell
dscl . -delete /Users/reto UserShell && dscl . -create /Users/reto UserShell /bin/zsh && dscl . -read /Users/reto UserShell

现在我得到了相同的环境:

  • SSH作为root
  • SSH作为用户
  • 终端.app
  • 从Java启动的进程
  • 到目前为止,几乎所有其他事情

到目前为止还不错。测试程序输出:

/usr/bin:/bin:/usr/sbin:/sbin
return value: 0
/usr/bin:/bin:/usr/sbin:/sbin
return value: 0
/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
return value: 0
v14.17.0
return value: 0
6.14.13
return value: 0

最新更新