2012-01-27 57 views
0

这是给人的ls只是输出:从Java程序运行系统命令有问题:

String[] cmd={"bash","-c","ls","-l"}: 
ProcessBuilder pb=new ProcessBuilder(cmd); 

尽管这是给长的正确列表输出:

String[] cmd={"bash","-c","ls -l"}; 
+3

而你的问题是? – Tudor 2012-01-27 16:16:58

+0

在Windows XP上运行。如果这很重要。 谢谢 – HelloWorld 2012-01-27 16:17:22

+0

我想知道为什么它没有给出我提到的第一种方式的输出。输出应该是一个长列表。 – HelloWorld 2012-01-27 16:18:46

回答

2

在第一代码片段,-l选项被作为参数传递给bash,而不是ls。 Bash将-l选项解释为指定它应该表现为“登录”shell。

-c之后的参数应该包含您想要执行的整个bash脚本(包含空格),所以第二个代码片段是正确的。

+0

哦,好吧。谢谢。但是如果我想使用cat命令动态显示文件呢?一个示例场景是当我想在循环中传递文件名以进行显示时。 – HelloWorld 2012-01-27 16:26:28

+0

如果你想用多个参数调用'cat',那么你可以使用一个StringBuilder和'for'循环来将命令行建立成单个字符串(文件名之间有空格)。它可以附加到字符串“cat”上,并用于'-c'后面的命令行参数。 – 2012-01-27 16:34:30

+0

非常感谢您的帮助。 – HelloWorld 2012-01-27 16:42:33

0

前者传递两个选项标志,以bash-c用争论ls,和-l根据手册页引起bash充当登录shell。

第二个通过一个选项标志-c,其中参数ls -l作为单个字符串。

+0

哦,好的。谢谢。但是如果我想使用cat命令动态显示文件呢?一个示例场景是当我想在循环中传递文件名以进行显示时 – HelloWorld 2012-01-27 16:28:40

0
String[] cmd={"bash","-c","ls -l"}: 
ProcessBuilder pb=new ProcessBuilder(cmd); 

的arguements都打坏,所以如果你想要的bash到interpert您通过“庆典”,“命令”,“-c”,... 那么下一个项目需要在您的整个命令,又名“ls -l”。

然后Bash将解析“命令”,并将-l作为参数发送给“ls”。目前它是“bash”的参数,这就是为什么你没有得到你想要的结果。