【问题标题】:Execute a linux terminal command in java?在java中执行linux终端命令?
【发布时间】:2012-09-11 06:56:47
【问题描述】:

我正在尝试从 java 执行 SOX 命令,但不幸的是它每次都返回错误。不过,其他所有 SOX 命令都可以正常工作!! 这是代码:

class Simple {
    public static void main(String args[]) throws IOException, Exception {
        Process p;
        BufferedReader br;
        String co = "sox speech_16.wav -p pad 0 2.5 | sox - -m speech_16.wav speech_output.wav";
        p = Runtime.getRuntime().exec(co);
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            int returnCode = p.waitFor();
        System.out.println("reurn code : "+returnCode);         
    }
}

当我在终端中执行相同的 sox 命令时,它工作正常。实在看不懂是什么问题!!是不是因为'|'象征??

【问题讨论】:

  • 它返回1。实际上它应该返回0。
  • sox 的返回码 1 是什么意思(查看手册页)?
  • @codebox 表示其输出中存在一些错误或“输出文件”尚未生成!根据上面的命令,它应该生成一个名为“speech_output.wav”的文件。
  • @codebox 问题不在于命令!我认为[我不确定]问题出在字符串被解析时!!

标签: java linux sox


【解决方案1】:

问题在于 Runtime.exec() 不理解诸如“|”之类的 shell 概念。而是尝试:

Runtime.getRuntime().exec("/bin/sh", "-c", co);

问题是 exec 直接运行二进制文件而不调用 shell。 “|”字符只被 shell 识别,sox 不识别。 “-c”告诉 shell 运行单个命令,并将整个命令作为单个参数传递。

【讨论】:

  • 不是目录路径——问题出在管道上:stackoverflow.com/a/5928316/184998
  • 但我真的需要包含 '|'工作。有没有办法把它包括在内?
  • 是的!有效!!谢谢@AdrianCox。这是因为管道符号。这是代码: String[] co = { "/bin/sh", "-c", "sox speech_16.wav -p pad 0 2.5 | sox - -m speech_16.wav speech_output.wav" }; p = Runtime.getRuntime().exec(co);
  • @epsalon 你能详细说明-c 的论点吗?
  • @epsalon 感谢很多朋友 :)))
【解决方案2】:

这可能与命令执行的环境有关,可能是以下任何一种:

  • 找不到sox 可执行文件(将完整路径放在命令中)
  • 用户没有运行sox命令的权限(检查文件权限中的执行位)
  • 当您从 Java 运行命令时,sox 所需的某些环境变量未初始化(查看 sox 文档)
  • 如果speech_16.wav 是sox 的输入文件,则找不到该文件(将.wav 文件的完整路径添加到命令)
  • 如果sox 需要创建一个输出文件,那么它没有权限这样做,要么是由于目录权限,要么是因为存在无法覆盖的同名文件,或者是因为空间不足在文件系统上。

【讨论】:

  • 终于成功了。这是因为命令中的管道符号。谢谢你的帮助顺便说一句:)
猜你喜欢
  • 2015-08-16
  • 2011-05-09
  • 2014-07-03
  • 2014-12-15
  • 2012-11-02
  • 2021-06-11
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多