java - 使用 ProcessBuilder 将错误重定向到文件

标签 java redirect stderr processbuilder

我正在尝试将 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

有人可以建议一下方法吗?

最佳答案

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

有两种解决方案。首先,Java 7 版本的 ProcessBuilder 添加了为子进程重定向标准 I/O channel 的功能。如果您使用的是 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 命令行中键入的任何内容。

关于java - 使用 ProcessBuilder 将错误重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994626/

相关文章:

java - JSON 到 Java 映射参数/通用类型

java - 使用 Apache Commons 将图像转换为 Base64

java - GUI 程序,选项卡面板的问题

php - .htaccess 重定向到仅用于主页的子域 (OpenCart)

python - 使用 Django 重定向和 HttpResponseRedirect 有什么区别?

Perl打开: how to forward stderr to stdout?

java - 如何将 OkHttp 包含到不使用 Gradle 或 Maven 的项目中?

security - 如何处理 HSTS 的端口重定向

python - Pyramid 记录

shell - 展示 bash shell stdout/stderr 重定向行为的备忘单