2013-07-02 3 views
1

Я пытаюсь создать java-программу, которая принимает некоторые пользовательские переменные и передает их в perl-скрипт (она фактически находит определенную строку в perl-скрипте и заменяет ее пользователем переменные-переменные). Вот код:Невозможно запустить команду UNIX из Java-программы

String sedMain = "sed -e "; 
    String sedFirstLine = "'s/AAA/"+newFirstLine+"/' -e "; 
    String sedNewCntr = "'s/BBB/"+newCntr+"/' -e "; 
    String sedNewSpacing = "'s/SPACE/"+newSpacing+"/' -e "; 
    String sedNewDmax = "'s/MAX/"+newDmax+"/'"; 
    String sedFile = " /filepath/myperlscript.pl > /filepath/myNEWperlscript.pl"; 
    String sedCommand=sedMain+sedFirstLine+sedNewCntr+sedNewSpacing+sedNewDmax+sedFile; 
    System.out.println("SED COMMAND: "+sedCommand); 
    String testRun = "touch /filepath/hello.txt"; 
    Process runSedCommand; 
    runSedCommand = Runtime.getRuntime().exec(sedCommand); 

Я использую IDE, и когда СЭД команда печатается на консоли, это выглядит правильно. Я скопировал команду sed из консоли и запускал ее с терминала, и это сработало. Я написал строку testRun, чтобы увидеть, была ли проблема с процессом в Java, и он создал файл «hello.txt». По какой-то причине моя программа не создает выходной файл perl «myNEWperlscript.pl». Я очень смущен, почему это не работает. Может ли кто-нибудь помочь?

+0

exec() принимает строку с именем и параметрами программы как свои элементы, но вы объединяете все вместе в одну строку и так эффективно теряете аргументы. –

+0

Так что я должен просто написать одну строку, содержащую все элементы? –

+0

Нет, вам нужно создать массив строк –

ответ

3

exec() принимает строку [] с именем и параметрами программы в качестве своих элементов, но вы объединяете все вместе в одну строку и так эффективно теряете аргументы.

попробовать что-то вроде этого:

String[] cmd = {"sed", "first argument", "second argument"}; 
Runtime.getRuntime().exec(cmd); 
+0

Спасибо! После небольшой настройки он работает. –

2

использовать

exec(String[] cmdarray) 

подпись. команда sed, -e - параметр, 's/AAA/\ n /' - еще один параметр и так далее. Таким образом, вы будете иметь

String[] command = new String[] {"sed", "-e", "s/AAA/\n/", "next parameter without single quotes", , "next parameter without quotes..."} 
Runtime.getRuntime.exec(command); 

Это единственный способ ваши параметры будут получать хорошо отформатирован на его пути к оболочке, иначе странно sruff может произойти любые кавычки после первого маркера на струне будет считаться просто один параметр, и поэтому кавычки могут быть экранированы, и подобные вещи

+0

Фактически, никакая оболочка не задействована, если только команда не является оболочкой. –

+0

Просьба пояснить это, как тогда дочерний процесс создается из JVM? –

+1

Выдав системный вызов ядру. Для этого не требуется оболочка - оболочка - это просто программа, которая дает вам больше возможностей для запуска программ, объединения их входных и выходных труб и т. Д., Но в конечном итоге использует системный вызов ядра так же, как вы можете. Например, попытка передать вывод sed в этот вопрос зависит от наличия оболочки, но никто не вызывается. Таким образом, плакат должен либо захватить вывод sed в файл, либо запустить оболочку, и сообщить, что для запуска sed и вывода вывода в файл. –

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