2012-10-10 63 views
1

我正在从Java程序执行一个shell脚本。我已经使用运行时类实现了它。下面是我实现的代码从java代码运行shell脚本并传递参数

final StringBuilder sb = new StringBuilder("test.sh"); 
sb.append("/path to/my/text file"); 

final Process p = Runtime.getRuntime().exec(sb.toString()); 

这里sb是字符串缓冲区对象,我追加我的参数并在exec方法中使用它。但问题是我通过参数“/路径/我/文本文件”被认为是4个参数

/path 
to 
/my/text 
file 

但是,如果在运行shell作为test.sh“/路径/我/文本文件”,这被视为单一参数。我如何使用Java代码实现相同的功能,我需要将空间视为单一参数来考虑此路径。任何请求都会非常可观。

回答

0

使用此:

final StringBuilder sb = new StringBuilder("test.sh"); 
sb.append(" \"/path to/my/text file\""); 
0

要重新创建你的shell手动运行该命令,test.sh "/path to/my/text file",您将需要包括引号。

final StringBuilder sb = new StringBuilder("test.sh"); 
sb.append(" \"/path to/my/text file\""); //notice escaped quotes 
final Process p = Runtime.getRuntime().exec(sb.toString()); 
0

你的做法是正确的,你只需要在参数

5

参数前添加一个space (" "),逃离"/" and " "字符使用ProcessBuilder,这就是它的设计,让您的生活更轻松

ProcessBuilder pb = new ProcessBuilder("test.sh", "/path", "/my/text file"); 
Process p = pb.start(); 
+0

为什么有2个参数“/ path”和“/ my/text file”?不应该是新的ProcessBuilder(“test.sh”,“/ path to/my/text file”) – Mojoy

+1

不,每个参数必须是分开的,否则它们将作为单个参数发送到进程,这就是为什么最后一个参数不需要在引号中转义 – MadProgrammer