Runtime.getRuntime.exec() Коды ошибок

Я пытаюсь использовать runtime.getruntime.exec в приложении Java.

В течение некоторого времени я пытался запустить другую команду, и я продолжаю получать код ошибки 2, который, как я обнаружил, означает, что файл или каталог не существует. Для проверки я попытался передать базовую команду и получил код ошибки 1. Почему я получаю это и что означает код ошибки 1?

Вот мой код:

  private String executeCommand(String command) {
    logger.info("executing command : " + command);
    String result = null;
    try {
        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec(command);

        BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
        String line = null;

        while ((line = input.readLine()) != null) {
            result = result + line;
        }

        while ((line = stdError.readLine()) != null) {
            result = result + line;
        }
        int exitVal = pr.waitFor();
        System.out.println("Exited with error code " + exitVal);


    } catch (IOException e) {
        e.printStackTrace();
    } catch (NumberFormatException e) {
        e.printStackTrace();
    } catch (Throwable e) {
        e.printStackTrace();

    }
    logger.info("This is the result:" + result);
    return result;

Вот как я это называю:

 String temp = executeCommand("cd $HOME/my-directory/my-subdirectory");

Вот мой вывод:

 INFO : programname - executing command : cd $HOME/my-directory/my-
        subdirectory
 Exited with error code 1
 INFO : programname - This is the result:null/usr/bin/cd[8]: $HOME/my-
        directory/my-subdirectory:  not found

person iswg    schedule 30.11.2017    source источник
comment
попробуйте окружить домашнюю переменную и выполнить String temp = executeCommand("cd ${HOME}/my-directory/my-subdirectory");   -  person Gal Shaboodi    schedule 30.11.2017
comment
Без изменений. Кроме того, эта команда работает совершенно нормально, если я запускаю ее в командной строке сам по себе.   -  person iswg    schedule 30.11.2017
comment
Попробуйте запустить String temp = executeCommand("/usr/bin/cd $HOME/my-directory/my-subdirectory");   -  person Gal Shaboodi    schedule 30.11.2017
comment
Без изменений снова   -  person iswg    schedule 30.11.2017


Ответы (2)


Runtime.getRuntime().exec(command) ожидает исполняемый файл в качестве первого параметра в переданной строке. Такие команды, как (cd, echo, etc...), предназначены только для инструмента командной строки и не будут работать как команды, передаваемые напрямую. Вам нужно будет сначала вызвать инструмент командной строки, а затем передать свою команду в качестве аргументов:

// Invoke Command Line Tool (.exe is optional) (cmd for windows sh for Linux)
// 1st argument indicates you want to run a command (/C for windows -c for Linux)
// 2nd argument is the cmd line command to run (echo)
Runtime.getRuntime().exec("cmd.exe /C echo helloworld");
Runtime.getRuntime().exec("sh -c echo helloworld");

На отдельной заметке. вы захотите инициализировать свой результат пустой строкой вместо нуля. В противном случае слово «null» будет добавлено к тому, что вы распечатываете.

person Steve    schedule 30.11.2017
comment
Я запускаю это на сервере unix. Просто пишет Невозможно запустить программу cmd.exe - person iswg; 30.11.2017
comment
Я использовал sh, и я все еще получаю тот же код ошибки. Все, что изменилось, это то, что вместо «не найдено» теперь написано «не существует». Однако именно в этом каталоге я запускаю программу, поэтому она определенно существует. - person iswg; 30.11.2017
comment
Кроме того, все мои ошибки с кодом 2 теперь имеют код 1 и говорят, что невозможно открыть вместо такого файла или каталога. Мне нужно имя пользователя и пароль для входа на этот unix-сервер. Отменяет ли sh некоторые разрешения или что-то подобное? - person iswg; 30.11.2017
comment
В этом другом сообщении stackoverflow описывается лучший способ сделать это, если вы получаете сообщение об ошибке «не удается открыть». stackoverflow.com/questions/17142573/ - person Steve; 01.12.2017

person    schedule
comment
Я запускаю это на сервере unix. Просто пишет Невозможно запустить программу cmd - person iswg; 30.11.2017