【问题标题】:Redirection of error into a file using ProcessBuilder使用 ProcessBuilder 将错误重定向到文件中
【发布时间】:2014-01-26 11:50:00
【问题描述】:

我正在尝试将 GCC 编译器产生的错误消息重定向到一个文件中 在使用 ProcessBuilder 编译 C 程序期间。代码是这样的

ProcessBuilder processBuilder1 = new ProcessBuilder("/usr/bin/gcc",
"-o"+"/home/hipad/hipad/UserProject/example","/home/hipad/hipad/UserProject/example.c
2>/home/hipad/hipad/UserProject/example.gccmessages");

processBuilder1.start();

但这会出错。错误是

"/usr/bin/gcc,-o/home/hipad/hipad/UserProject/example,/home/hipad/hipad/UserProj‌​ect/example.c 2>/home/hipad/hipad/UserProject/example.gccmessages": error=2, No such file or directory

任何人都可以建议这样做的方法吗?

【问题讨论】:

  • 你遇到了什么错误?
  • @Lakshmi_java.io.IOException: 无法运行程序“/usr/bin/gcc,-o/home/hipad/hipad/UserProject/example,/home/hipad/hipad/UserProject/example .c 2>/home/hipad/hipad/UserProject/example.gccmessages": error=2, 没有这样的文件或目录
  • 检查 example.gccmessages 是否确实存在于该路径中。
  • 代码(如图所示)实际上不会编译干净。 1) 为了尽快获得更好的帮助,请发布SSCCE。 2) 阅读(并实施)所有When Runtime.exec() won't 的建议。那可能会解决问题。如果没有,它应该提供更多关于失败原因的信息。然后忽略它引用exec 并(继续)使用ProcessBuilder 构建Process

标签: java redirect stderr processbuilder


【解决方案1】:

命令行重定向是您正在使用的 shell(bash、sh、csh 等)提供的一项功能。您的 ProcessBuilder 正在直接启动 gcc,而不使用 shell。因此,重定向和管道等 shell 功能不可用。

有两种解决方案。首先,ProcessBuilder 的 Java 7 版本增加了为子进程重定向标准 I/O 通道的功能。如果您使用的是 Java 7,这应该可以工作:

ProcessBuilder pb1 = new ProcessBuilder(
    "/usr/bin/gcc",
    "-o",
    "/home/hipad/hipad/UserProject/example",
    "/home/hipad/hipad/UserProject/example.c");
pb1.redirectError(new File("/home/hipad/hipad/UserProject/example.gccmessages"));

如果您没有使用 Java 7 或不想这样做,您可以运行一个 shell 并让它为您运行 gcc。此方法使您可以完全访问 shell 的命令行解析功能:

ProcessBuilder pb1 = new ProcessBuilder(
    "sh",
    "-c",
    "gcc -o /home/hipad/hipad/UserProject/example /home/hipad/hipad/UserProject/example.c 2> /home/hipad/hipad/UserProject/example.gccmessages");

在这种情况下,最后一个参数可以是您可以在 sh 命令行中键入的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多