【问题标题】:AppleScript Command Works in Terminal but not in JavaAppleScript 命令在终端中有效,但在 Java 中无效
【发布时间】:2021-07-18 18:54:51
【问题描述】:

我的主要问题是如何使下面提到的命令在 java 中工作,这个命令的主要问题是它不执行我命令它执行的脚本;有人可以帮我让这个苹果脚本在 java 中工作吗?

我不明白,但由于某种原因命令:

osascript -e 'tell application "Terminal" to do script "cd /Users/benjaminsloutsky/eclipse-workspace/stack/Stack/StackProjects/Brother/build && cmake .. && cmake --build . && ./cmake-good"'

在终端中执行,但是每当我尝试使用 Runtime.getRuntime().exec() 命令在 java 中运行它时,它根本不会执行(它不会向我显示一个正在执行代码的新终端窗口,但是在终端工作)。这个命令的重点是显示一个带有 main.cpp 文件输出的新终端。这是我的java代码:

final String innerCommand = 
     "cd /Users/benjaminsloutsky/eclipse-workspace/stack/Stack/StackProjects/Brother/build && cmake .. && cmake --build . && ./cmake-good";
String[] comm = new String[] {
     "/bin/bash", "-c", 
     "osascript -e 'tell application \"Terminal\" to do script \"" +
     innerCommand + "\"'"
};
Runtime.getRuntime().exec(comm);

它没有运行。为什么会这样,我该如何解决这个问题,以便我的脚本也可以在 javafx 中运行。该命令的目的是显示一个新的终端窗口,然后运行一个脚本。

我认为我正在正确运行 comm 变量中列出的多个命令,并且我正在使用运行时执行命令。

提前谢谢你!

【问题讨论】:

  • 在您的 Java 代码中将 "\"'" 更改为 "\""' 不应该在那里。
  • 啊。好的,我现在明白了。但我必须修复你过长的 Java 行以明确发生了什么。
  • 终端窗口是否在当前窗口后面打开;见apple.stackexchange.com/questions/205143
  • 试着让它只是打开一个终端并回显一些东西。
  • 你想错了。重新发布问题是一个主要的禁忌。转发被这里的人解释为“寻求关注的行为”。您很可能会发现该转贴被大量否决,然后被关闭。引起对 StackOverflow 问题的关注的(唯一)合法方式是发布奖励。

标签: java javafx terminal applescript runtime


【解决方案1】:

Runtime.getRuntime().exec() 不是在 Java 中运行和管理外部进程的最佳方式,最好使用 java.lang.ProcessBuilder

所以你的代码可以像这样用java.lang.ProcessBuilder表示。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class CommandExecutor {

    public static void main(String[] args) {
        CommandExecutor executor = new CommandExecutor();
        executor.executeInTerminal("cd /Users/benjaminsloutsky/eclipse-workspace/stack/Stack/StackProjects/Brother/build && cmake .. && cmake --build . && ./cmake-good");
    }

    public void executeInTerminal(String command){
        List<String> cms = new ArrayList<>();
        cms.add("/bin/sh");
        cms.add("-c");
        cms.add("osascript -e 'tell application \"Terminal\" to do script \"" + command + "\"'");

        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.command(cms);
        try {

            Process process = processBuilder.start();

            StringBuilder output = new StringBuilder();

            BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream()));

             String line;
             while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }

            boolean success = process.waitFor(1, TimeUnit.MINUTES);
            // check the status
        } catch (IOException | InterruptedException e) {
            // do some logging
        }
    }
}

【讨论】:

  • 为什么这在 java 中可以完美运行,但在 javafx 中却不行?
  • @BenjaminSloutsky 应该没有什么区别,你有代码 sn-p 显示你是如何执行它的吗?
  • @BenjaminSloutsky 你在主线程中运行吗?
  • 这可能是个问题,试试 Platform.runLater
  • 这可能是你的 IO 的问题,尝试processBuilder.redirectOutput(ProcessBuilder.Redirect.PIPE);processBuilder.redirectErrorStream(true);processBuilder.inheritIO().start() 否则共享一个不起作用的代码。
猜你喜欢
  • 1970-01-01
  • 2019-05-07
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多