为什么Runtime.exec(String)对于某些命令有效,而对于某些命令无效?

13 浏览
0 Comments

为什么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

与此同时,将其复制粘贴到我的shell中:

myshell$ ls -l 'My File.txt'
-rw-r--r-- 1 me me 4 Aug  2 11:44 My File.txt

为什么会有差异?何时会工作,何时会失败?如何使其适用于所有命令?

0