运行时的 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 选项? @user2110167new ProcessBuilder("somecommand", "-o", "outputdirectory", "-i", "inputfilelist");
以上是关于运行时的 exec() 方法不重定向输出的主要内容,如果未能解决你的问题,请参考以下文章
将 Visual C++ 控制台输出复制(不重定向)到文本文件,同时仍在控制台窗口中查看输出