возникли проблемы при запуске команд Linux в Java

1

почему я получаю следующую ошибку:

Exception in thread "main" java.io.IOException: Cannot run program "cd": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at com.terminal.Main.main(Main.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:187)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 6 more

здесь код, который я использую:

Runtime.getRuntime().exec("cd ~/");
Process pwd = Runtime.getRuntime().exec("pwd");
try (Scanner scanner = new Scanner(pwd.getInputStream())) {
    while (scanner.hasNextLine()) {
        System.out.println(scanner.nextLine());
    }
}

а также когда я пытаюсь выполнить некоторые другие команды, такие как sudo или ./, снова возникает IOException... в чем проблема? любая идея?

благодаря :)

  • 0
    Вам нужен интерпретатор (оболочка) для запуска команды cd . Сам по себе CD не является исполняемой программой.
Теги:
terminal
command-line

1 ответ

0

Как упоминал агад, cd не является программой, это команда оболочки. Чтобы изменить рабочий каталог для вызова exec(), используйте три метода аргументов:

try {
    File wd = new File("~/");
    Process pwd = Runtime.getRuntime().exec("pwd", null, wd);
    Scanner scanner = new Scanner(pwd.getInputStream());
    while (scanner.hasNextLine()) {
        System.out.println(scanner.nextLine());
    }
}
catch (Exception e) {
    System.out.println(e.getMessage());
}

Как вы могли заметить, этот код по-прежнему возвращает ошибку, поскольку использование тильды в качестве ссылки на домашний каталог является еще одним преимуществом оболочки. Вы можете либо заменить "~/" на домашний каталог, либо в более вероятном случае, когда он неизвестен, вы можете использовать следующий код для получения каталога:

try {
    String homedir = System.getProperty("user.home");
    File wd = new File(homedir);
    Process pwd = Runtime.getRuntime().exec("pwd", null, wd);
    Scanner scanner = new Scanner(pwd.getInputStream());
    while (scanner.hasNextLine()) {
        System.out.println(scanner.nextLine());
    }
}
catch (Exception e) {
    System.out.println(e.getMessage());
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню