题
我使用这个代码,以使我的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文件甚至没有运行...
解决方案
我只想确保你的shell脚本对执行位,只是在通过shell脚本文件名。
Process p = Runtime.getRuntime().exec(myPath + "/punchRender.sh")
修改强>
我不知道Java的具体是否有无论如何设置文件权限的Unix / Linux的使用它来设置执行位或如何逃脱的报价。但它会是这样的:
Process chmod = Runtime.getRuntime().exec("chmod u+x \"" + myPath + "/punchRenderer.sh\"")
其他提示
此应该工作。不仅在运行脚本,但打开一个终端也:
Process p = Runtime.getRuntime().exec("open -a /Applications/Utilities/Terminal.app \"" + myPath + " /punchRender.sh\"");
如果你想有一个新的可视终端窗口,你不能直接运行shell。你需要启动终端,然后运行.command文件,而不是一个shell脚本。我不知道这将是多么困难的是命令的标准输出连接到您的Java进程。您可能需要找出让输出到终端的一些其他的方式。
顺便说一句,我想你的代码,在家里我自己的Mac一类,它跑了sh文件就好了。我跑在命令行的Java类。也许SH只是不在你的PATH。
我想你已经检查了sh文件是可执行的,不是吗?
我可以建议你捕捉标准错误的以及的为标准输出,并转储。这应该给你一些想法,这是怎么回事(这是很好的做法一般)。
您可能需要收集标准输出和标准误差在不同的线程以避免阻塞的问题。请参阅此处一个StreamGobbler