从java代码运行shell脚本:语法错误:“(”意外

时间:2012-10-10 11:52:58

标签: java shell unix

我正在尝试从Java代码运行shell脚本。

Shell脚本:

        function print() {
            echo "First Script"
        }
        print
        echo "Hello"

Java代码:

        final String cmd = "sh test.sh";
        final Process p = Runtime.getRuntime().exec(cmd);
        InputStream is = p.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
          System.out.println(line);
        }

        is = p.getErrorStream();
        isr = new InputStreamReader(is);
        br = new BufferedReader(isr);
        while ((line = br.readLine()) != null) {
          System.out.println(line);
        }

但是当我运行上面的代码时,我收到此错误test.sh: 1: Syntax error: "(" unexpected

当我在命令行中尝试时,相同的代码工作正常,我能够看到输出。我也试过dos2unix并运行了java代码,但仍然没有运气。任何形式的帮助都将非常感激。

3 个答案:

答案 0 :(得分:3)

如果您使用bash运行它,它将起作用。

我会(也)用#!/bin/bash启动脚本。这样,脚本本身就会确定它将使用哪个shell,而不是依赖于调用它的人。如下所述,您仍然可以使用任何脚本编写过程调用脚本,但 shebang 将突出显示正在使用的脚本语言/方言。

另请注意the issues surrounding invoking processes from Java and collecting stdout/sterr

答案 1 :(得分:1)

最有可能的是,在你的系统/bin/sh上是一个与POSIX兼容的shell而不是Bash(在Ubuntu和Debian以及大多数商业Unices中就是这种情况)。在POSIX shells中,请勿使用function关键字:

print() {
    echo "First Script"
}
print
echo "Hello"

应该有效。 (这种形式也适用于Bash。)

答案 2 :(得分:-2)

验证您的Java版本是否与您的操作系统匹配。 您的操作系统可能是32b,Java是64版本。