#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'");
(*) Обычно это считается плохой практикой безопасности, поскольку нежелательные команды могут выполняться в зависимости от среды