2012-10-10 88 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