运行时的 exec() 方法不重定向输出

Posted

技术标签:

【中文标题】运行时的 exec() 方法不重定向输出【英文标题】:Runtime's exec() method is not redirecting the output 【发布时间】:2013-04-20 18:17:29 【问题描述】:
Process p = Runtime.getRuntime().exec("sh somescript.sh &> out.txt");

我正在使用 Java 运行此命令。该脚本正在运行,但它没有将其流重定向到文件。此外,文件out.txt 没有被创建。

如果我在 shell 上运行,这个脚本运行良好。

有什么想法吗?

【问题讨论】:

为什么是 & 符号? 它用于将输出流和错误流重定向到文件 您是否在系统中搜索过该文件? 1) 阅读runtime.exec info. page。实施所有链接的 Java World 文章中的建议。 2) 然后忽略它引用exec 并使用ProcessBuilder(String[]) 构造函数。 3) 我听说管道在 Java 进程中不起作用。 管道(和重定向)通常不会在 UNIX 上工作,因为它们是 shell 所做的事情。在这种情况下,正在执行 sh。 Runtime.exec 的行为在很大程度上没有记录。 【参考方案1】:

当您运行命令时,没有 shell 正在运行,并且任何 shell 命令或函数都不可用。要使用 &> 之类的东西,您需要一个 shell。你有一个,但你没有把它传递给它。试试吧。

Runtime.getRuntime().exec(new String[]  "sh", "somescript.sh &> out.txt" );

【讨论】:

这不会编译,是吗? 没有接受此类输入的重载 exec 函数,因为它会产生编译错误 @commentators: Runtime.getRuntime().exec(new String[] "sh", "somescript.sh &> out.txt" );【参考方案2】:

您需要使用ProcessBuilder 进行重定向。

ProcessBuilder builder = new ProcessBuilder("sh", "somescript.sh");
builder.redirectOutput(new File("out.txt"));
builder.redirectError(new File("out.txt"));
Process p = builder.start(); // may throw IOException

【讨论】:

它工作得非常好。谢谢..是否有任何参考资料可以让我阅读更多关于此的内容,我必须使用 java 在 shell 上做很多事情。所以它对我很有用 @user2110167 API document about ProcessBuilder 如果这个答案帮助你解决了问题,有机会请accept它。 还有一件事,如果我想在命令中添加一些选项,比如 somecommand -o "outputdirectory" -i "inputfilelist" ,我该如何添加 -o 和 -i 选项? @user2110167 new ProcessBuilder("somecommand", "-o", "outputdirectory", "-i", "inputfilelist");

以上是关于运行时的 exec() 方法不重定向输出的主要内容,如果未能解决你的问题,请参考以下文章

为啥下面的系统调用输出不重定向到文件?

将 Visual C++ 控制台输出复制(不重定向)到文本文件,同时仍在控制台窗口中查看输出

Rails 3 - 链接/按钮运行 ajax 请求而不重定向

重定向进入空白页面而不重定向到路由 Laravel 5.8

临时重定向标准输出/标准错误

django重定向不重定向