Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AppleScript命令在终端中工作,但在Java中不工作_Java_Javafx_Terminal_Applescript_Runtime - Fatal编程技术网

AppleScript命令在终端中工作,但在Java中不工作

AppleScript命令在终端中工作,但在Java中不工作,java,javafx,terminal,applescript,runtime,Java,Javafx,Terminal,Applescript,Runtime,我的主要问题是如何使下面提到的命令在java中工作,该命令的主要问题是它不执行我命令它执行的脚本;有人能帮我用java编写这个apple脚本吗? 我不明白,但出于某种原因,命令: osascript-e'告诉应用程序“终端”执行脚本“cd/Users/benjaminsloutsky/eclipse workspace/stack/stack/StackProjects/Brother/build&&cmake..&&cmake--build.&&cmake good” 在终端中执行,但每当我尝

我的主要问题是如何使下面提到的命令在java中工作,该命令的主要问题是它不执行我命令它执行的脚本;有人能帮我用java编写这个apple脚本吗?

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

osascript-e'告诉应用程序“终端”执行脚本“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
变量中列出的多个命令,并且我正在运行时执行该命令

提前谢谢你

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.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.TimeUnit;
公共类命令执行器{
公共静态void main(字符串[]args){
CommandExecutor executor=新CommandExecutor();
executor.executeInTerminal(“cd/Users/benjaminsloutsky/eclipse workspace/stack/stack/StackProjects/Brother/build&&cmake..&&cmake--build.&&cmake good”);
}
public void executeInTerminal(字符串命令){
List cms=新的ArrayList();
cms.添加(“/bin/sh”);
cms.添加(“-c”);
添加(“osascript-e'告诉应用程序\“终端\”执行脚本\”“+命令+“\””);
ProcessBuilder ProcessBuilder=新的ProcessBuilder();
processBuilder.command(cms);
试一试{
Process=processBuilder.start();
StringBuilder输出=新的StringBuilder();
BufferedReader reader=新的BufferedReader(
新的InputStreamReader(process.getInputStream());
弦线;
而((line=reader.readLine())!=null){
输出。追加(行+“\n”);
}
布尔成功=process.waitFor(1,TimeUnit.MINUTES);
//检查状态
}捕获(IOException | InterruptedException e){
//做些日志记录
}
}
}
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.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.TimeUnit;
公共类命令执行器{
公共静态void main(字符串[]args){
CommandExecutor executor=新CommandExecutor();
executor.executeInTerminal(“cd/Users/benjaminsloutsky/eclipse workspace/stack/stack/StackProjects/Brother/build&&cmake..&&cmake--build.&&cmake good”);
}
public void executeInTerminal(字符串命令){
List cms=新的ArrayList();
cms.添加(“/bin/sh”);
cms.添加(“-c”);
添加(“osascript-e'告诉应用程序\“终端\”执行脚本\”“+命令+“\””);
ProcessBuilder ProcessBuilder=新的ProcessBuilder();
processBuilder.command(cms);
试一试{
Process=processBuilder.start();
StringBuilder输出=新的StringBuilder();
BufferedReader reader=新的BufferedReader(
新的InputStreamReader(process.getInputStream());
弦线;
而((line=reader.readLine())!=null){
输出。追加(行+“\n”);
}
布尔成功=process.waitFor(1,TimeUnit.MINUTES);
//检查状态
}捕获(IOException | InterruptedException e){
//做些日志记录
}
}
}

将Java代码中的
“\”
更改为
“\”
不应该在那里。好的,我现在明白了。但是我必须修复你过长的Java代码行,以明确发生了什么;看,试着让它打开一个终端,然后回显一些东西。你想错了。转载一个问题是一个重大的禁忌。这里的人把转载解释为“寻求关注的行为”。您可能会发现,回购被严重否决,然后dup关闭。引起人们对StackOverflow问题注意的(唯一)合法方法是发布奖金。将Java代码中的
“\”
更改为
“\”
不应该在那里。好的,我现在明白了。但是我必须修复你过长的Java代码行,以明确发生了什么;看,试着让它打开一个终端,然后回显一些东西。你想错了。转载一个问题是一个重大的禁忌。这里的人把转载解释为“寻求关注的行为”。您可能会发现,回购被严重否决,然后dup关闭。(唯一)吸引人们注意StackOverflow问题的合法方法是发布奖金。为什么