如何从Java运行与自制或MacPorts一起安装的工具? 我正在尝试用Java在MacOS上实现一些自动化 从终端手动运行命令时没有问题 我认为它之所以能工作是因为/.zprofile 试图通过ProcessBuilder执行命令时,找不到这些命令

如何从Java运行与自制或MacPorts一起安装的工具? 我正在尝试用Java在MacOS上实现一些自动化 从终端手动运行命令时没有问题 我认为它之所以能工作是因为/.zprofile 试图通过ProcessBuilder执行命令时,找不到这些命令,java,macos,shell,homebrew,processbuilder,Java,Macos,Shell,Homebrew,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", "ec

如何在与手动运行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

在阅读了太多关于贝壳的文章并进行了研究之后,我决定选择Zsh

原因是,这表明Zsh似乎至少有一个init文件,它针对所有可能的shell变量(登录、非登录、交互、非交互等)执行

我将所有环境设置(路径和语言)移动到
/etc/zshenv
,删除了
/etc/zprofile
和所有
~/.z*
文件

我也要对Zsh()进行修改:

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

  • SSH作为根
  • SSH作为用户
  • Terminal.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

您可以查看此项,也可以指定二进制文件的完整路径(
获取
节点的
完整路径的节点)。但是IMO你真的应该考虑第一个选择;
/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