Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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
使用Java运行Bash脚本_Java_Bash_Shell_Unix - Fatal编程技术网

使用Java运行Bash脚本

使用Java运行Bash脚本,java,bash,shell,unix,Java,Bash,Shell,Unix,我试图运行一个Bash脚本来比较两个文件,看看它们是否相同(除了最后几行)。当我手动运行脚本时,我编写的脚本工作得很好,但是,因为我希望脚本在java程序之后立即运行,所以我使它在java程序完成所有其他操作后运行脚本,但是当这种情况发生时,我会得到一个语法错误 有人能解释一下当我从java程序运行bash脚本时为什么会发生这种情况,以及如何修复它吗 fileChangeCheck.sh 错误消息 $java-jar retrieve.jar fileChangeCheck.sh:第12行:意外

我试图运行一个Bash脚本来比较两个文件,看看它们是否相同(除了最后几行)。当我手动运行脚本时,我编写的脚本工作得很好,但是,因为我希望脚本在java程序之后立即运行,所以我使它在java程序完成所有其他操作后运行脚本,但是当这种情况发生时,我会得到一个语法错误

有人能解释一下当我从java程序运行bash脚本时为什么会发生这种情况,以及如何修复它吗

fileChangeCheck.sh

错误消息

$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());
    }