为什么 Runtime.exec(String) 适用于某些命令,但不适用于所有命令?
当我尝试运行时,某些命令可以工作,而其他命令则被执行但失败或执行与我的终端不同的操作。下面是一个独立的测试用例,演示了效果: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
为什么会有差异?它什么时候工作,什么时候失败?如何使其适用于所有命令?