Использование Java Runtime class для запуска нескольких команд unix

#java #unix

#java #unix

Вопрос:

Я пытаюсь использовать Runtime class для выполнения некоторых команд UNIX, но у меня возникают проблемы, если я пытаюсь использовать cd command.

Вот моя Java-программа:

 import java.io.*;

public class JavaRunCommand {

    public static void main(String args[]) {

        String s = null;

        try {

            Process p = Runtime.getRuntime().exec("cd;cat test.txt|grep Hello");

            BufferedReader stdInput = new BufferedReader(new
                 InputStreamReader(p.getInputStream()));

            BufferedReader stdError = new BufferedReader(new
                 InputStreamReader(p.getErrorStream()));

            // read the output from the command
            System.out.println("Here is the standard output of the command:n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }

            // read any errors from the attempted command
            System.out.println("Here is the standard error of the command (if any):n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }

            System.exit(0);
        }
        catch (IOException e) {
            System.out.println("exception..");
            e.printStackTrace();
            System.exit(-1);
        }
    }
}
 

Если я выполняю это, я получаю исключение как:

 java.io.IOException: Cannot run program "cd": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
    at java.lang.Runtime.exec(Runtime.java:617)
    at java.lang.Runtime.exec(Runtime.java:450)
    at java.lang.Runtime.exec(Runtime.java:347)
    at JavaRunCommand.main(JavaRunCommand.java:11)
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:135)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
    ... 4 more
 

Пожалуйста, дайте мне знать, как мы можем запускать несколько команд, если я хочу использовать его в Java.

Комментарии:

1. cd не является binray. Это встроенная команда оболочки.

2. cd является аргументом, переданным исполняемому /bin/sh файлу .

3. Используйте ProcessBuilder, а не Runtime.exec. docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

Ответ №1:

Если вы замените

 Process p = Runtime.getRuntime().exec("cd;cat test.txt|grep Hello");
 

с помощью

 Process p = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "cd amp;amp; cat test.txt | grep Hello" });
 

это должно сработать.

Поскольку cd является встроенной командой оболочки, вам необходимо вызвать свою оболочку для ее выполнения. При использовании Windows вам потребуется вызвать "cmd /c" .

Ответ №2:

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

Самое простое решение — использовать абсолютные пути в вызываемых вами командах. Например, вместо того, чтобы пытаться выполнить "cd /my/dir; cat test.txt" простой вызов "cat /my/dir/test.txt" .

Ответ №3:

Как вы спросили, как запускать несколько команд и привели cd;cat test.txt|grep Hello в качестве примера, вам необходимо sh обработать вашу команду, потому что это не одна исполняемая программа.

Несмотря на последствия для безопасности (*), вы можете сделать

 Process p = Runtime.getRuntime().exec("/bin/sh -c 'cd;cat test.txt|grep Hello'");
 

(*) Обычно это считается плохой практикой безопасности, поскольку нежелательные команды могут выполняться в зависимости от среды