2015-02-20 3 views
0

Команда «cat ~/desktop/b.mpg ~/desktop/b2.mpg> ~ desktop/intermediate_all.mpg», похоже, работает только с использованием Java Runtime (как показано в примере ниже);

Почему одна и та же команда работает в скрипте bash, но не в Java Runtime напрямую?

public class Test { 
    public static void main(final String[] args) { 
     String[] cmd = {"cat ~/desktop/b.mpg ~/desktop/b2.mpg > ~desktop/intermediate_all.mpg"}; 
     try { Runtime.getRuntime().exec(cmd); } 
     catch (IOException e) { e.printStackTrace();} 
    } 
} 


Однако, если положить в .sh файл, как во втором примере он работает просто отлично ....

public class Test { 
    public static void main(final String[] args) { 
     try { Runtime.getRuntime().exec("https://stackoverflow.com/users/nn/desktop/configure.sh"); } 
     catch (IOException e) { e.printStackTrace();} 
    } 
} 


enter image description here

Может кто-нибудь, пожалуйста, скажите мне, что фундаментальный процесс теряется при переходе от сценария bash к прямому Java Runtime? FYI, я использую OSX, уже пробовал использовать абсолютные пути к файлу, и знать о Process Builder (который имеет тот же эффект) предпочтительнее использовать Java Runtim - как уже было сказано тысячу раз на этом форуме, поэтому позволяет избежать побоев мертвая лошадь на этом.

Благодаря

+1

'~ desktop' - это не то же самое, что' ~/desktop'. – Amadan

ответ

1

Команда выполняется в cat с аргументами. Команда и ее аргументы должны быть отдельными элементами массива.

Кроме того, вы не можете перенаправить с помощью Runtime.exec() - вы должны использовать ProcessBuilder:

Попробуйте это:

ProcessBuilder pb = new ProcessBuilder("cat", "~/desktop/b.mpg", "~/desktop/b2.mpg"); 
pb.redirectOutput(new File("~/desktop/intermediate_all.mpg")); 
Process p = pb.start(); 

Вполне вероятно, что местоположение оболочки ~ не будет понятно, так что вы можете иметь использовать полный абсолютный путь для файлов

0

Попробуйте это:

Runtime.getRuntime().exec(new String[] { 
    "/bin/bash", "-c", 
    "cat ~/desktop/b.mpg ~/desktop/b2.mpg > ~/desktop/intermediate_all.mpg" }) 
-1

в вашем java-коде ~/desktop/b.mpg ~/desktop/b2.mpg> ~ desktop/intermediate_all.mpg, лет u должен дать полный путь после> ~/desktop/intermediate_all.mpg

0

Потому что во втором случае вы эффективно используете "bash", "-c", "cat etc >file", где Bash заботится о разборке перенаправления для вас. Перенаправление - это свойство оболочки, а не cat; если вы запускаете необработанный процесс без оболочки, функции оболочки вам недоступны.

Смежные вопросы