Когда я пытаюсь запустить Runtime.exec(String)
, некоторые команды работают, в то время как другие команды выполняются, но терпят неудачу или делают разные вещи, чем в моем терминале. Вот автономный тестовый пример, демонстрирующий эффект:
public class ExecTest {
static void exec(String cmd) throws Exception {
Process p = Runtime.getRuntime().exec(cmd);
int i;
while( (i=p.getInputStream().read()) != -1) {
System.out.write(i);
}
while( (i=p.getErrorStream().read()) != -1) {
System.err.write(i);
}
}
public static void main(String[] args) throws Exception {
System.out.print("Runtime.exec: ");
String cmd = new java.util.Scanner(System.in).nextLine();
exec(cmd);
}
}
Этот пример отлично работает, если я заменяю команду echo hello world
, но для других команд, особенно тех, которые связаны с именами файлов с такими пробелами, как здесь, я получаю ошибки, хотя команда явно выполняется:
myshell$ javac ExecTest.java && java ExecTest
Runtime.exec: ls -l 'My File.txt'
ls: cannot access 'My: No such file or directory
ls: cannot access File.txt': No such file or directory
тем временем, скопировать в мою оболочку:
myshell$ ls -l 'My File.txt'
-rw-r--r-- 1 me me 4 Aug 2 11:44 My File.txt
Почему существует разница? Когда это работает, и когда это не удается? Как заставить его работать для всех команд?