【问题标题】:Running external script from Java application on OS X在 OS X 上从 Java 应用程序运行外部脚本
【发布时间】:2012-11-15 16:28:33
【问题描述】:

我在从 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();

但这给出了同样的错误。据我所知,我正在做其他类似问题中建议的所有事情,但没有任何效果。任何想法将不胜感激!

【问题讨论】:

    标签: java macos runtime.exec processbuilder


    【解决方案1】:

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

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

    processFile $3
    

    那你需要改成说

    processFile "$3"
    

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

    processFiles $*
    

    那么你需要用

    替换它
    processFiles "$@"
    

    【讨论】:

    • 太好了,谢谢!在脚本本身中使用引号就可以了。让我失望的是,当我尝试运行脚本并从终端传递参数(带双引号)时,它运行良好,所以我认为问题出在 Java 代码而不是脚本上。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多