【问题标题】:Linux Shell command from java [duplicate]来自java的Linux Shell命令[重复]
【发布时间】:2018-01-28 18:02:44
【问题描述】:

我正在尝试从 Java 运行 Linux 命令。该命令从命令行本身运行完美,但从 Java 却没有。 命令行的命令是

curl -H "Content-Type: text/plain" -d "$(printf '#Genes\nPIK3C2A\nPTEN\nUNC5B')" -X POST --url https://reactome.org/AnalysisService/identifiers/projection/

来自Java的命令是

 String $notifyMsg="\"$(printf '#Genes\nPIK3C2A\nPTEN\nUNC5B')\"";
 String $reactome = "https://reactome.org/AnalysisService/identifiers/projection/";
 String $notifyTitle= "\"Content-Type: text/plain\"";
 String $command = "curl" + " " + "-H"+ " " +  $notifyTitle + " "+ "-d " + $notifyMsg +" "+ "-X" + " " + "POST" + " " +  " " + "--url" +" " + $reactome;
 System.out.println("Command is: " + $command);

      Process p=Runtime.getRuntime().exec($command);
      p.waitFor();
      System.out.println("Run Result " + p.exitValue() )

我应该得到这样的输出

{"summary":{"token":"MjAxODAxMjMxNjQyMDZfNjcy","projection":true,"interactors":false,"type":"OVERREPRESENTATION","sampleName":"Genes","text":true},"expression":{"columnNames":[]},"identifiersNotFound":0,"pathwaysFound":51,"pathways":

但是我得到 0 。谁能告诉我可能出了什么问题?

【问题讨论】:

  • 考虑使用 jsoup 或 apache http 组件或任何其他 Java 库。你不需要在这里使用 curl。
  • 当有许多本地 Java 库可以执行此操作时,为什么要通过启动 curl 来下载文件?

标签: java linux shell


【解决方案1】:

引用和逃避是你的敌人。最好的办法是完全避免它们。使用一种方法开始该过程,该方法可让您将各个参数作为单独的字符串传递,而无需将它们分开。

Process p = new ProcessBuilder(
    "curl",
    "-H", "Content-Type: text/plain",
    "-d", "#Genes\nPIK3C2A\nPTEN\nUNC5B",
    "-X", "POST",
    "--url", "https://reactome.org/AnalysisService/identifiers/projection/"
).start();

您的代码调用exitValue(),它会为您提供进程的退出代码。要读取其输出,请从其input stream 读取。

InputStream s = p.getInputStream();

【讨论】:

    【解决方案2】:

    p.exitValue() 会给你进程的退出代码。它返回 0,因为 curl 成功,退出代码为 0。

    我会考虑研究 HttpClient library 以在 Java 中本地执行这些。

    【讨论】:

      【解决方案3】:

      这对我有用:

      String notifyMsg = "#Genes\nPIK3C2A\nPTEN\nUNC5B";
      String reactome = "https://reactome.org/AnalysisService/identifiers/projection/";
      String notifyTitle = "Content-Type: text/plain";
      
      Process p = new ProcessBuilder("curl", "-H", notifyTitle, "-d", notifyMsg, "-X", "POST", "--url", reactome).start();
      p.waitFor();
      try (Scanner scanner = new Scanner(new InputStreamReader(p.getInputStream()))) {
          while (scanner.hasNextLine()) {
              System.out.println(scanner.nextLine());
          }
      }
      System.out.println("Run Result " + p.exitValue());
      
      1. 不要手动连接命令行,使用ProcessBuilder的可变参数构造函数
      2. 在您的Content-Type 指令和您的-d 中有额外的双引号
      3. $(printf 是 shell 解释的东西,但 Java 没有。只需在 Java 字符串文字中使用 \n 即可获得新行。

      我还添加了一些代码来读取输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        • 2015-01-29
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        相关资源
        最近更新 更多