使用Java运行Bash脚本
我试图运行一个Bash脚本来比较两个文件,看看它们是否相同(除了最后几行)。当我手动运行脚本时,我编写的脚本工作得很好,但是,因为我希望脚本在java程序之后立即运行,所以我使它在java程序完成所有其他操作后运行脚本,但是当这种情况发生时,我会得到一个语法错误 有人能解释一下当我从java程序运行bash脚本时为什么会发生这种情况,以及如何修复它吗 fileChangeCheck.sh 错误消息使用Java运行Bash脚本,java,bash,shell,unix,Java,Bash,Shell,Unix,我试图运行一个Bash脚本来比较两个文件,看看它们是否相同(除了最后几行)。当我手动运行脚本时,我编写的脚本工作得很好,但是,因为我希望脚本在java程序之后立即运行,所以我使它在java程序完成所有其他操作后运行脚本,但是当这种情况发生时,我会得到一个语法错误 有人能解释一下当我从java程序运行bash脚本时为什么会发生这种情况,以及如何修复它吗 fileChangeCheck.sh 错误消息 $java-jar retrieve.jar fileChangeCheck.sh:第12行:意外
$java-jar retrieve.jar
fileChangeCheck.sh:第12行:意外标记“(”附近出现语法错误
fileChangeCheck.sh:第12行:`diff您正在调用sh,它将只运行此脚本;告诉系统使用bash运行它的顶部“注释”被sh忽略,而sh可能不是bash,因此这是需要研究的。这也是相当可疑的,在许多系统上可能会失败;我建议在最短的时间内显式调用'/bin/bash'至少
这可能会解决它。如果不是,可能是当前工作目录不同的问题
编辑:应用评论员戴夫·汤普森的建议。Processbuilder有许多选项可供设置:
try {
final Process pr = new ProcessBuilder("fileChangeCheck.sh").directory(new File(yourDirectory)).redirectOutput(new File(logfile))
.start();
pr.waitFor();
} catch (IOException | InterruptedException e) {
System.out.println(e.getMessage());
}
没有注意到——或者更简单地说,是忽略了Hanks,这让我了解了我调用的内容,结果发现我的语法对于sh不正确,但是对于bash很好。可能有一种更简单的方法,但是为了避免diff命令的语法,我修改了代码,创建了两个新文件,并对它们进行了比较。谢谢你的建议,如果没有它,我就不会这么做了我迷路了一段时间。
public static void filecheck() throws Exception {
Process p = Runtime.getRuntime().exec("sh "+directory+"fileChangeCheck.sh");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
line = "";
while ((line = errorReader.readLine()) != null) {
System.out.println(line);
}
}
$ java -jar retrieve.jar
fileChangeCheck.sh: line 12: syntax error near unexpected token `('
fileChangeCheck.sh: line 12: `diff <(head -n -3 output/current.json) <(head -n -3 output/newfile.json) > output/check.txt'
try {
final Process pr = new ProcessBuilder("fileChangeCheck.sh").directory(new File(yourDirectory)).redirectOutput(new File(logfile))
.start();
pr.waitFor();
} catch (IOException | InterruptedException e) {
System.out.println(e.getMessage());
}