【问题标题】:Run CMD equivalent in OSX?在 OSX 中运行 CMD 等价物?
【发布时间】:2010-10-14 23:34:08
【问题描述】:

我正在使用这段代码让我的 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 文件甚至没有运行...

【问题讨论】:

  • 如果您能描述一下错误,那将会很有帮助。

标签: java macos shell scripting sh


【解决方案1】:

我会确保你的 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\"")

【讨论】:

  • 这只会启动一个 bash 进程,而不是终端应用程序。
  • 我正在用同一个程序编写 .sh 文件,就在它运行之前......我如何用执行位编写它?
【解决方案2】:

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

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

【讨论】:

  • 这行不通。 OP 正在尝试捕获脚本的输出。这里的进程 p 是“打开”命令,它不产生任何输出。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-18
        • 2011-01-26
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 2011-04-03
        • 2012-06-12
        • 2012-01-20
        • 2012-08-23
        相关资源
        最近更新 更多