本文介紹了Java Runime.getRuntime().exec(Cmd)命令包含單引號的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我需要使用Java通過一個命令來同步多個文件
以下命令在外殼中運行良好
Rsync-avrz–Timeout=100 rsync://10.149.21.211:8730/‘logflow/click/file1日志流/單擊/文件2’/主頁/kerrycai/puler”
但當我使用以下Java代碼時,它無法工作
String cmd = "rsync -avrz --timeout=100 rsync://10.149.21.211:8730/'logflow/click/file1 logflow/click/file2' /home/kerrycai/puller";
Process p = Runtime.getRuntime().exec(cmd);
int ret = p.waitFor();
ret值不等于0(在我的測試中是5),命令執行不成功,經過調試,似乎是單引號引起的問題
所以,我的問題是
-
我是否可以使用Java執行包含單引號的外殼命令(請注意,單引號位于參數中間,而不是開始/結束)?
我是否可以讓一個外殼命令在一個命令中rsync多個文件,并且該命令中沒有單(雙)引號?
推薦答案
@chris注意:在一個參數中組合多個文件名(真正修改的部分類似的文件名)確實非常不尋常,總體上對unix來說甚至是”可疑的”,但對于rsync
是正確的(或者至少曾經是正確的)。
前言:JavaRuntime.exec
不‘執行外殼命令’(除非您顯式運行外殼并給它一個命令);它運行帶有參數的程序。這些不同的東西經常被混淆,因為普通用戶使用的大多數外殼命令都是運行程序的命令,但這是一個差異很重要的情況。特別是,將空格引用到外殼程序會導致外殼程序向包含該空格的程序傳遞單個參數,而不是拆分成兩個(或更多)參數,但引號本身不包括在參數中。
首先,您應該查看高級用法下的手冊頁(在您的系統上或在線https://download.samba.org/pub/rsync/rsync.html)。Rsync的當前(甚至是較舊的)版本有一種更方便的語法使用單獨的參數來獲取多個文件,Runtime.exec(String)
使用的簡單解析可以處理這些文件:
rsync -avrz --timeout=100 --port=8730 10.149.21.211::logflow/click/file1 ::logflow/click/file2 /home/kerrycai/puller
但是,如果您需要(或確實想要)使用帶引號的形式,那么您需要自己進行標記化,并使用@EJP建議的String[]
重載–盡管您仍然可以使用Runtime
,但您不需要為此使用ProcessBuilder
。具體地做一些類似的事情:
String[] cmdarray = {"rsync",
"-avrz",
"--timeout=100",
"rsync://10.149.21.211:8730/logflow/click/file1 logfile/click/file2",
// separated argument contains space but not single (or other) quote
"/home/kerrycai/puller" };
... Runtime.getRuntime.exec(cmdarray); ...
這篇關于Java Runime.getRuntime().exec(Cmd)命令包含單引號的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,