为什么Runtime.exec(String)对于某些命令有效,而对于某些命令无效?
为什么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
为什么会有差异?何时会工作,何时会失败?如何使其适用于所有命令?