在OS X上从Java应用程序运行外部脚本

时间:2012-11-15 16:28:33

标签: java macos runtime.exec processbuilder

我在使用OS X 10.8上的Java应用程序运行外部脚本时遇到了实际问题。它适用于Windows,所以不确定我在OS X上做错了什么。

什么有效(Windows):

String[] commands = {
    "\"" + _appDataDir + "\\Temp\\Workers\\" + _batchName + "\"", 
    "\"" + _appDataDir + "\\Temp\\frame%d.jpg\"", 
    "\"" + _fileName + "\""};
proc = rt.exec(commands);

所以我对OS X有以下内容:

String[] commands = {
    _appDataDir + "/Temp/Workers/" + _batchName,
_appDataDir + "/Temp/Workers/mac-ffmpeg",   
_appDataDir + "/Temp/frame%d.jpg", 
"\"" + _fileName + "\""};
proc = rt.exec(commands);

当文件名中没有空格时可以使用,但当存在带有“java.io.IOException:Bad file descriptor”错误的空格时会失败。

目前,我已将所有路径更改为没有空格作为简单修复,但我无法控制fileName字符串,因为用户从保存对话框中选择了该字符串。我试过在fileName周围使用和不使用双引号但是没有任何区别。

我也尝试过如下的ProcessBuilder(有和没有“/ bin / bash /, - c”位):

ProcessBuilder proc2 = new ProcessBuilder(
    "/bin/bash",
"-c",
_appDataDir + "/Temp/Workers/" + _batchName,
_appDataDir + "/Temp/Workers/mac-ffmpeg",
_appDataDir + "/Temp/frame%d.jpg",
"\"" + _fileName + "\""
);
proc = proc2.start();

但这会产生同样的错误。据我所知,我正在做其他类似问题所建议的一切,但没有任何工作。任何想法将不胜感激!

1 个答案:

答案 0 :(得分:1)

您不需要"\"" + _fileName + "\""周围的引号,只需一个普通的_fileName即可。当您向Runtime.exec(或ProcessBuilder)提供数组时,您已将命令分成“单词” - 如果添加引号,则告诉它查找名称相同的文件实际上是双引号+ _fileName +双引号,而不仅仅是_fileName

真正的问题可能在_batchName程序中,这可能是一个通过调用其他程序来完成实际工作的shell脚本。在该脚本中,您将收到mac-ffmpegframe%d.jpg_fileName个参数$1$2$3,您需要确保它们在脚本中被正确引用,例如如果脚本当前说的是

processFile $3

然后你需要改变它来说

processFile "$3"

如果要处理包含空格的文件名。或者,如果它被设置为一次处理多个文件:

processFiles $*

然后你需要用

替换它
processFiles "$@"