Выполнить команду терминала Linux в java?

Я пытаюсь выполнить команду SOX из java, но, к сожалению, каждый раз она возвращает ошибку. Все остальные команды 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 в терминале, она работает нормально. Я вообще не могу понять в чем проблема!! Это из-за '|' символ??


person sree127    schedule 11.09.2012    source источник
comment
Он возвращает 1. На самом деле он должен возвращать 0.   -  person sree127    schedule 11.09.2012
comment
и что означает код возврата 1 от sox (проверьте справочную страницу)?   -  person codebox    schedule 11.09.2012
comment
@codebox означает, что в его выводе есть какая-то ошибка или «выходной файл» не был сгенерирован! В соответствии с приведенной выше командой он должен сгенерировать файл с именем voice_output.wav.   -  person sree127    schedule 11.09.2012
comment
@codebox Проблема не в команде! я думаю [я не уверен] проблема со строкой, когда она анализируется!!   -  person sree127    schedule 11.09.2012


Ответы (2)


Проблема в том, что Runtime.exec() не понимает такие понятия оболочки, как "|". Вместо этого попробуйте:

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

Проблема в том, что exec запускает двоичный файл напрямую, не вызывая оболочку. "|" символ распознается только оболочкой, а не sox. «-c» указывает оболочке запустить одну команду и передает всю команду в качестве одного аргумента.

person epsalon    schedule 11.09.2012
comment
Проблема не в пути к каталогу, а в канале: stackoverflow.com/a/5928316/184998 - person Adrian Cox; 11.09.2012
comment
Но мне действительно нужно включить '|' для работы. Есть ли способ включить это? - person sree127; 11.09.2012
comment
Да! это сработало!! спасибо @AdrianCox. Это было из-за символа трубы. Вот код: String[] co = { /bin/sh, -c, sox speech_16.wav -p pad 0 2.5 | sox - -m речь_16.wav речь_выход.wav }; p = Время выполнения.getRuntime().exec(co); - person sree127; 11.09.2012
comment
@epsalon, не могли бы вы уточнить аргумент -c, пожалуйста? - person mtk; 11.09.2012
comment
@epsalon Большое спасибо друг :))) - person sree127; 11.09.2012
comment
Я добавил больше подробностей к ответу. Надеюсь, это прояснит ситуацию. - person epsalon; 11.09.2012

Вероятно, это связано со средой, в которой выполняются команды, это может быть любое из следующего:

  • Не удается найти исполняемый файл sox (укажите полный путь в команде)
  • У пользователя нет разрешения на запуск команды sox (проверьте бит выполнения в правах доступа к файлу)
  • Некоторая переменная среды, необходимая для sox, не инициализируется при запуске команды из Java (см. документацию sox)
  • Если speech_16.wav является входным файлом для sox, то файл не может быть найден (добавьте в команду полный путь к файлу .wav)
  • Если sox необходимо создать выходной файл, то у него нет на это разрешения либо из-за разрешений каталога, либо из-за того, что существует файл с таким именем, который нельзя перезаписать, либо из-за нехватки места в файловой системе. .
person codebox    schedule 11.09.2012
comment
Наконец-то это сработало. Это было из-за символа трубы в команде. Спасибо за вашу помощь кстати :) - person sree127; 11.09.2012