【问题标题】:Using Quotes within getRuntime().exec在 getRuntime().exec 中使用引号
【发布时间】:2008-10-02 11:43:15
【问题描述】:

我想使用字符串作为输入来调用 bash。比如:

sh -l -c "./foo"

我想从 Java 中执行此操作。不幸的是,当我尝试使用 getRuntime().exec 调用命令时,我收到以下错误:

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

这似乎与我的字符串没有以 EOF 终止有关。

有没有办法将特定于平台的 EOF 插入到 Java 字符串中?还是我应该寻找另一种方法,例如在调用“sh”之前写入临时脚本?

【问题讨论】:

  • 您是在编译时还是在运行时收到错误消息?
  • 您用来调用 bash 的 Java 代码是什么?您在该 Java 代码中使用的字符串似乎是错误的。不幸的是,它们在帖子中丢失了,使其不是特别有用......

标签: java exec runtime.exec


【解决方案1】:

使用这个:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

要点:不要放双引号。这只是在shell中编写命令行时使用!

例如,echo "Hello, world!"(在 shell 中输入)被翻译为:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(暂时忘记shell通常具有echo的内置函数,而是调用/bin/echo。:-))

【讨论】:

    【解决方案2】:

    Windows 命令行的行为与 UNIX、Mac OS X 和 GNU/Linux 不同。

    在 Windows 上,进程在可执行文件名称(和空格)之后逐字接收输入文本。然后由程序来解析命令行(这通常是隐式完成的,程序员通常对这个过程一无所知)。

    在 GNU/Linux 中,shell 处理命令行,确保将熟悉的字符串数组传递给 C 的 main 函数。你没有那个壳。最好的方法(即使在 Windows 上)是使用其中一种 exec 形式,您可以在其自己的 String 中单独传递每个命令行参数

    Process exec​(String[] cmdarray)    
    Process exec​(String[] cmdarray, String[] envp)     
    Process exec​(String[] cmdarray, String[] envp, File dir)
    

    或者更好,java.lang.ProcessBuilder

    如果你真的想要,你可以得到一个 shell 来为你做解析。这将使您的示例看起来像(未经测试):

    Runtime.getRuntime().exec(new String[] {
        "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
    });
    

    【讨论】:

      【解决方案3】:

      EOF 不是字符,因此无法编写 EOF。 您忘记关闭带引号的字符串。

      【讨论】:

        【解决方案4】:

        此错误的原因很可能是缺少 bash 期望的语法标记,但您传递的字符串在 bash 遇到它之前就结束了。寻找没有关闭 fi 或 done 的 ifs、fors 等。

        【讨论】:

          【解决方案5】:

          在字符串中的引号需要被转义。 而不是写“写\”。

          例如

          strcpy(c, "这是一个字符串\"带\"引号");

          【讨论】:

            【解决方案6】:

            如果我是你,我会将字符串的内容写入一个临时 bash 文件,然后查看 bash 执行该文件时是否没有任何错误。如果执行没有错误,那么我会考虑进一步调试;

            【讨论】:

              猜你喜欢
              • 2012-12-14
              • 1970-01-01
              • 1970-01-01
              • 2012-07-26
              • 1970-01-01
              • 2012-01-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多