我在使用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();
但这会产生同样的错误。据我所知,我正在做其他类似问题所建议的一切,但没有任何工作。任何想法将不胜感激!
答案 0 :(得分:1)
您不需要"\"" + _fileName + "\""
周围的引号,只需一个普通的_fileName
即可。当您向Runtime.exec
(或ProcessBuilder
)提供数组时,您已将命令分成“单词” - 如果添加引号,则告诉它查找名称相同的文件实际上是双引号+ _fileName
+双引号,而不仅仅是_fileName
。
真正的问题可能在_batchName
程序中,这可能是一个通过调用其他程序来完成实际工作的shell脚本。在该脚本中,您将收到mac-ffmpeg
,frame%d.jpg
和_fileName
个参数$1
,$2
和$3
,您需要确保它们在脚本中被正确引用,例如如果脚本当前说的是
processFile $3
然后你需要改变它来说
processFile "$3"
如果要处理包含空格的文件名。或者,如果它被设置为一次处理多个文件:
processFiles $*
然后你需要用
替换它processFiles "$@"