AppleScript命令在终端中工作,但在Java中不工作
我的主要问题是如何使下面提到的命令在java中工作,该命令的主要问题是它不执行我命令它执行的脚本;有人能帮我用java编写这个apple脚本吗? 我不明白,但出于某种原因,命令: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” 在终端中执行,但每当我尝
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问题的合法方法是发布奖金。为什么