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
使用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