【问题标题】:Getting error in calling shell script in windows environment using java code and cygwin...!使用 java 代码和 cygwin 在 windows 环境中调用 shell 脚本时出错...!
【发布时间】:2012-04-08 18:43:58
【问题描述】:

我想使用 java 代码在 windows 环境中调用 shell 脚本。 我正在尝试执行下面的代码来运行我的测试脚本(不是实际脚本):

Java 代码:

public static void main (String args[]) {
        Runtime r = Runtime.getRuntime();
        try {
            Process p = r.exec("C:\\cygwin\\bin\\bash -c '/cygdrive/d/scripts/test.sh'");
            InputStream in = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            System.out.println("OUT:");
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            in = p.getErrorStream();
            br = new BufferedReader(new InputStreamReader(in));
            System.out.println("ERR:");
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            p.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

test.sh

#!/bin/bash

rm -rf ./test

但我收到这些错误,并且脚本无法删除目录。

错误: /cygdrive/d/ereader/scripts/test.sh:第 2 行:$'\r':找不到命令 /cygdrive/d/ereader/scripts/test.sh:第 3 行:rm:找不到命令

另一件事,当我从 cygwin 终端运行脚本时,它工作正常。我检查了路径变量,它们都很好。但是我尝试通过java代码执行相同的脚本,它给出了错误..

现在如何告诉java程序在哪里引用rm命令?

【问题讨论】:

    标签: java linux jakarta-ee cygwin


    【解决方案1】:

    赠品是“\r”错误。

    Windows 和 Unix(包括 Mac 和 Linux)使用不同的新行表示。 Windows 使用 '\r\n' 而 Unix 只使用 '\n'。大多数编程编辑器都考虑到这一点,并且只插入一个“\n”,以便他们使用 Unix 工具。

    我建议在 Notepad++ 等其他编辑器中重新键入您的 shell 脚本(仅插入 '\n'),或者确保您当前的编辑器设置为使用 Unix 换行符。您必须重新键入它,否则错误的 '\r\n' 序列将被复制。你可能有一些运气来做一个全部替换,但这对我来说总是很不稳定。

    【讨论】:

    • /r 已删除,但主 rm 命令错误怎么办...我该如何删除它?
    【解决方案2】:

    您可能需要首先在 test.sh 脚本中设置 PATH 变量。确保 rm 在您设置的 PATH 中

    【讨论】:

    • 已设置路径变量... #echo $PATH /usr/local/bin:/usr/bin:/cygdrive/c/springsource/springsource/maven-2.2.1.RELEAS E/ bin:/cygdrive/c/Program Files/TortoiseSVN/bin
    • 此输出来自 test.sh 中的 echo $PATH?
    • no 此输出来自 cygwin 终端 echo $PATH ...从 cygwin 终端运行时脚本也可以正常工作。但是从 java 程序运行时会出错。java 中缺少某些内容仅程序
    • @dhroove 如何在 test.sh 中设置 PATH 并查看问题是否解决?
    【解决方案3】:

    没有真正回答。您可以尝试关注以缩小问题范围

    1. 使用 ProcessBuilder 而不是 Process。处理参数要友好得多。
    2. 在脚本中设置 rm (/bin/rm) 的绝对路径
    3. 使用目录的绝对路径删除或在确认您位于正确的目录后删除..

    您的 bash 提示符是 cygwin.bat 使用 --login 调用 bash 的结果。它将有路径变量和其他有用的东西来源。 bash -c 不这样做。

    1. 尝试使用 bash -l -c <command> 启动 bash.exe:这会获取 bash 配置文件。

    【讨论】:

    • 我不认为用 /bin/rm 替换 rm 是个好主意。我有很长的 unix 管理员编写的脚本...必须有其他出路...
    • 而且我已经写了......脚本在从cygwin窗口触发时运行良好......所以java代码中缺少一些东西......
    • 我尝试使用 -lc 命令启动 bash shell... 我收到以下错误 ERR: /usr/bin/bash: --: invalid option Usage: /usr/bin/bash [GNU long选项] [选项] ... /usr/bin/bash [GNU 长选项] [选项] 脚本文件 ... GNU 长选项:--debug --debugger --dump-po-strings --dump-strings --help --init-file --login --noediting --noprofile --norc --posix --protected --rcfile --restricted --verbose --version Shell 选项:-irsD 或 -c 命令或 -O shopt_option(仅调用)-abefhkmnptuvxBCHP 或 -o 选项
    • 很抱歉上述评论的格式不正确.. 将其复制并粘贴到记事本中.. 比你能得到更好的主意。
    • @dhroove:-l 和 -c 之间有一个空格(你可以试试 -lc)
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多