0

我正在使用此代码使我的 Java 程序打开一个(可见的)CMD 窗口:

try {
            String line;
            Process p = Runtime.getRuntime().exec("cmd /C start \"Render\" \"" + myPath + "\\punchRender.cmd\"");
             BufferedReader input =
                    new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((line = input.readLine()) != null) {
            System.out.println(line);
            jLabel7.setText(line);

            }
            input.close();
        } catch (Exception err) {
            err.printStackTrace();
        }

我一直在尝试对 OSX 终端做同样的事情,这就是我现在所处的位置:

  try {
            String line;
            Process p = Runtime.getRuntime().exec("sh " + myPath + "/punchRender.sh");
             BufferedReader input =
                    new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((line = input.readLine()) != null) {
            System.out.println(line);
            jLabel7.setText(line);

            }
            input.close();
        } catch (Exception err) {
            err.printStackTrace();
        }

到目前为止,没有运气:(有什么建议吗?.sh 文件甚至没有运行......

4

5 回答 5

2

我只是确保你的 shell 脚本有执行位,然后传入 shell 脚本文件名。

Process p = Runtime.getRuntime().exec(myPath + "/punchRender.sh")

编辑:

我不知道 Java 是否有任何方式为 Unix/Linux 设置文件权限以设置 eXecute 位或如何转义引号。但它会是这样的:

Process chmod = Runtime.getRuntime().exec("chmod u+x \"" + myPath + "/punchRenderer.sh\"")

于 2009-03-23T14:08:22.330 回答
2

这应该有效。不仅运行脚本,还打开终端:

Process p = Runtime.getRuntime().exec("open -a /Applications/Utilities/Terminal.app \"" + myPath + " /punchRender.sh\"");

于 2009-03-23T14:15:39.427 回答
1

如果你想要一个新的可见终端窗口,你不能直接运行 shell。您需要启动终端,然后运行 ​​.command 文件,而不是 shell 脚本。我不确定将该命令的标准输出连接到您的 Java 进程有多难。您可能必须想办法将输出输入终端。

顺便说一句,我在家中自己的 Mac 上的一个课程中尝试了您的代码,它运行了一个 .sh 文件就好了。我正在从命令行运行 java 类。也许 sh 只是不在您的 PATH 中。

于 2009-03-23T14:15:50.393 回答
0

我假设您已经检查过 .sh 文件是可执行的,不是吗?

于 2009-03-23T14:08:20.740 回答
0

我可以建议您捕获标准错误以及标准输出,然后转储它。这应该让您对正在发生的事情有所了解(通常这是一种很好的做法)。

您可能需要在不同的线程中收集标准输出和标准错误以避免阻塞问题。看这里_StreamGobbler

于 2009-03-23T14:22:41.377 回答