Как использовать команду "cd", используя Java runtime? - PullRequest
48 голосов
/ 03 февраля 2011

Я создал отдельное Java-приложение, в котором я пытаюсь изменить каталог с помощью команды "cd" в терминале Ubuntu 10.04. Я использовал следующий код.

String[] command = new String[]{"cd",path};
Process child = Runtime.getRuntime().exec(command, null);

Но приведенный выше код выдает следующую ошибку

Exception in thread "main" java.io.IOException: Cannot run program "cd": java.io.IOException: error=2, No such file or directory

Может кто-нибудь подсказать, пожалуйста, как это реализовать?

Ответы [ 7 ]

55 голосов
/ 03 февраля 2011

Не существует исполняемого файла с именем cd, поскольку он не может быть реализован в отдельном процессе.

Проблема в том, что у каждого процесса есть свой текущий рабочий каталог, и реализация cd как отдельного процесса может изменить только , что обрабатывает текущий рабочий каталог.

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

Единственный случай, когда текущий рабочий каталог имеет значение, - это выполнение внешнего процесса (с использованием ProcessBuilder или Runtime.exec()). В этих случаях вы можете явно указать рабочий каталог, который будет использоваться для вновь запущенного процесса (ProcessBuilder.directory() и с тремя аргументами Runtime.exec() соответственно).

Примечание: текущий рабочий каталог можно прочитать из системного свойства user.dir. Вы можете испытать соблазн установить это системное свойство. Обратите внимание, что это приведет к очень серьезным несоответствиям , потому что это не означает для записи .

15 голосов
/ 14 января 2014

См. Ссылку ниже (это объясняет, как это сделать):

http://alvinalexander.com/java/edu/pj/pj010016

т.е.:

String[] cmd = { "/bin/sh", "-c", "cd /var; ls -l" };
Process p = Runtime.getRuntime().exec(cmd);
12 голосов
/ 18 июля 2014

Вы изучили эту команду exec для среды выполнения java, создайте объект файла с путем, который вы хотите "cd", а затем введите его в качестве третьего параметра для метода exec.

public Process exec(String command,
                String[] envp,
                File dir)
         throws IOException

Выполняет указанную строковую команду в отдельном процессе с указанной средой и рабочим каталогом.

Это удобный метод. Вызов формы exec (команда, envp, dir) ведет себя точно так же, как и вызов exec (cmdarray, envp, dir), где cmdarray - это массив всех токенов в команде.

Точнее, командная строка разбивается на токены с помощью StringTokenizer, созданного вызовом new StringTokenizer (команда) без дальнейшей модификации категорий символов. Затем токены, созданные токенизатором, помещаются в новый строковый массив cmdarray в том же порядке.

Parameters:
    command - a specified system command.
    envp - array of strings, each element of which has environment variable settings in the format name=value, or null if the subprocess should inherit the environment of the current process.
    dir - the working directory of the subprocess, or null if the subprocess should inherit the working directory of the current process. 
Returns:
    A new Process object for managing the subprocess 
Throws:
    SecurityException - If a security manager exists and its checkExec method doesn't allow creation of the subprocess 
    IOException - If an I/O error occurs 
    NullPointerException - If command is null, or one of the elements of envp is null 
    IllegalArgumentException - If command is empty
7 голосов
/ 04 апреля 2015

Эта команда отлично работает

Runtime.getRuntime().exec(sh -c 'cd /path/to/dir && ProgToExecute)
1 голос
/ 11 ноября 2018

Используя один из методов построителя процесса, мы можем передать каталог, в котором мы ожидаем, что будет выполнен cmd. Пожалуйста, смотрите ниже пример. Также вы можете указать время ожидания процесса, используя метод wait for.

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", cmd).directory(new File(path));

        Process p = builder.start();

        p.waitFor(timeoutSec, TimeUnit.SECONDS);

В приведенном выше коде вы можете передать объект файла с путем [где мы ожидаем, что cmd будет выполнен] в метод каталога ProcessBuilder

1 голос
/ 05 апреля 2017

Попробуйте использовать:

Runtime.getRuntime.exec("cmd /c cd path"); 

Это сработало

Runtime r = Runtime.getRuntime(); 
r.exec("cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf"); 

Нижеследующее не сработало При использовании команды массива НЕ РАБОТАЕТ

String[] cmd = {"cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf"}; r.exec(cmd);

К вашему сведению, я использую утилиту для проверки ОС, если ее вышеупомянутые окна будут работать для других окон, кроме удаления cmd и / c

0 голосов
/ 03 мая 2017

Я решил эту проблему с помощью приложения Java, выполняющего сценарий sh, который находился в том же каталоге, а затем в сценарии sh выполнил команду "cd".

Требовалось, чтобы я сделал "cd" для определенного каталога, чтобы целевое приложение могло работать должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...