"使用ProcessBuilder进行输出重定向"
P粉517090748
2023-08-24 20:26:08
<p>我正在尝试使用以下代码将ProcessBuilder启动的进程的输出重定向:</p>
<pre class="brush:php;toolbar:false;">ProcessBuilder pb = new ProcessBuilder("/myScript >> /myLogFile 2>&1 <& - &");
Map<String, String> env = pb.environment();
env.clear();
env.put("var1", "val1");
env.put("var2", "val2");
pb.redirectErrorStream(true);
Process p = pb.start();</pre>
<p>但是它失败了,抛出异常:</p>
<blockquote>
<p>Exception in thread "main"
java.io.IOException: Cannot run
program
"/myScript >>
/myLogFile
2>&1 <& - &": java.io.IOException:
error=2, No such file or directory at
java.lang.ProcessBuilder.start(ProcessBuilder.java:460)</p>
</blockquote>
<p>当我只传递"/myScript"时,它正常工作。</p>
<p>脚本是perl,对于为什么它失败的任何建议/评论?</p>
<p>我尝试将它们作为单独的参数传递,例如<code>new ProcessBuilder("/myScript",">>","/myLogFile")</code>,它可以执行,但不会重定向到日志文件,也不会接受envVars。</p>
根据您的要求,从Java7开始,您可以继续使用ProcessBuilder,只需将可执行文件作为参数,并使用ProcessBuilder类中的
redirectInput()
、redirectOutput()
和redirectError()
来重定向/拦截其输出流。Shell重定向操作符在
ProcessBuilder
中是未知的。将您的命令放在一个shell脚本中并执行它,如这里所示。或者,使用bash -c
,如这里所示。