запустить команду оболочки из java

Я работаю над приложением, и у меня возникла проблема с запуском команды оболочки из java-приложения. вот код:

public String execRuntime(String cmd) {

        Process proc = null;
        int inBuffer, errBuffer;
        int result = 0;
        StringBuffer outputReport = new StringBuffer();
        StringBuffer errorBuffer = new StringBuffer();

        try {
            proc = Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            return "";
        }
        try {
            response.status = 1;
            result = proc.waitFor();
        } catch (InterruptedException e) {
            return "";
        }
        if (proc != null && null != proc.getInputStream()) {
            InputStream is = proc.getInputStream();
            InputStream es = proc.getErrorStream();
            OutputStream os = proc.getOutputStream();

            try {
                while ((inBuffer = is.read()) != -1) {
                    outputReport.append((char) inBuffer);
                }

                while ((errBuffer = es.read()) != -1) {
                    errorBuffer.append((char) errBuffer);
                }

            } catch (IOException e) {
                return "";
            }
            try {
                is.close();
                is = null;
                es.close();
                es = null;
                os.close();
                os = null;
            } catch (IOException e) {
                return "";
            }

            proc.destroy();
            proc = null;
        }


        if (errorBuffer.length() > 0) {
            logger
                    .error("could not finish execution because of error(s).");
            logger.error("*** Error : " + errorBuffer.toString());
            return "";
        }


        return outputReport.toString();
    }

но когда я пытаюсь выполнить команду типа:

/export/home/test/myapp -T "some argument"

myapp читает "some argument" как два отдельных аргумента, но я хочу читать "some argument" только как аргумент. когда я запускаю эту команду напрямую из терминала, она выполняется успешно. Я пробовал '"some argument"' , ""some argument"" , "some\ argument", но у меня это не сработало. как я могу прочитать этот аргумент как один аргумент.


person masay    schedule 17.03.2010    source источник


Ответы (2)


Я помню, что перегрузка метода exec предоставляет параметр для аргументов отдельно. Вам нужно использовать это

Ага. Вот

public Process exec(String[] cmdarray)
             throws IOException

Просто сделайте командную строку и все аргументы отдельными элементами массива String

person Midhat    schedule 17.03.2010

сначала создайте строку
String cmd="/export/home/test/myapp -T \"некоторый аргумент\"";
затем запустите cmd в proc

person Yasir    schedule 17.05.2011
comment
Это не делает абсолютно ничего, кроме того, на что уже указал Айкут. - person Milad Naseri; 29.05.2012
comment
@MiladNaseri За исключением того, что он правильно избегает кавычек, что было настоящей ошибкой Айкута. - person Silveri; 27.08.2013
comment
@Silveri - За исключением того, что это не работает. Вы не можете использовать кавычки в командной строке через Java. Java не понимает цитирование оболочки. - person Stephen C; 24.03.2018