0

我正在尝试从 Java 代码运行 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 代码,但仍然没有运气。任何形式的帮助将不胜感激。

4

3 回答 3

3

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

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

还要注意从 Java 调用进程和收集 stdout/sterr 的问题

于 2012-10-10T11:55:05.633 回答
1

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

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

应该管用。(而且这种形式也适用于 Bash。)

于 2012-10-10T11:57:04.347 回答
-2

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

于 2014-10-10T14:52:34.527 回答