STDOUT 无法通过 Groovy API 以编程方式工作

STDOUT does not work programmatically via Groovy API

使用espeak命令生成音频

 espeak "Hello Mr. Toumi" --stdout > /tmp/audio123.wav

当我运行这个命令使用终端时,它工作正常。


现在在 API 中为 Grails 服务中的这个命令做准备

#EspeakService.groovy
   File speak(String message){
       Process pr='espeak "'+message+'" --stdout > '+filePath(message);
        pr.waitFor()
        return new File(filePath(message));
   }

当我 运行: espeakService.speak('Hello Mr. Toumi') 时,没有生成文件,也没有显示错误消息。 任何想法:为什么它不能以编程方式工作?

> 这样的重定向是由 shell 完成的。要么使用 ['sh', '-c', 'espeak ...'].execute()。或者只是从进程中获取 stdout,这样可以避免处理文件。例如

def p = "echo -n 666".execute()
p.waitFor()
assert p.in instanceof InputStream
assert p.in.text == "666"

Java 的外部进程执行机制不是 shell 并且不支持像这样使用 > 的重定向。您应该使用 ProcessBuilder 并使用它进行重定向:

ProcessBuilder pb = new ProcessBuilder("espeak", message, "--stdout")
File out = new File(filePath(message))
pb.redirectOutput(out)
pb.redirectError(ProcessBuilder.Redirect.INHERIT)
pb.start().waitFor()
return out