2 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
exec
不是一個完整的外殼。
為方便起見,它確實允許您傳遞帶有可執(zhí)行文件名稱和參數(shù)的單個字符串(與使用版本相反String[]
),但它用于拆分該字符串的邏輯非常簡單,它只是調(diào)用new StringTokenizer(command)
,它只是拆分為空格,并且不了解完整命令 shell 會提供的特殊引用和轉(zhuǎn)義行為。
所以你的單引號沒有被尊重。
gvim /etc/fstab '+normal GW' // last quoted section supposed to be a single arg
成為
String[]{ "gvim", "/etc/fstab", "'+normal", "GW'" } // four args instead of three
如何從 Java 中將上述命令作為單個字符串調(diào)用?
你真的需要這個嗎?除非應(yīng)用程序動態(tài)地接受來自交互式用戶的命令行輸入,否則應(yīng)該可以在編寫程序時拆分參數(shù)。那樣安全多了。
如果你真的需要這個,你可以將整個字符串傳遞給命令 shell。
嘗試 Runtime.getRuntime().exec(new String[]{"bash", "-c", theCommand });
但是涉及一些開銷。
除此之外,您可以嘗試找到一個可以“正確”拆分字符串的 Java 庫。

TA貢獻1829條經(jīng)驗 獲得超9個贊
根據(jù)文檔exec(String command)
將整個字符串視為命令,如果我們查看文檔
public Process exec(String command) throws IOException
在單獨的進程中執(zhí)行指定的字符串命令。
這是一個方便的方法。exec(command) 形式的調(diào)用與調(diào)用 exec(command, null, null) 的行為方式完全相同。
參數(shù):
command - 指定的系統(tǒng)命令。
來到exec(String[] cmdarray)
它會將 cmdarray 視為包含要調(diào)用的命令及其參數(shù)的數(shù)組。這是這兩種方法之間的唯一區(qū)別,這可能是問題所在
public Process exec(String[] cmdarray) throws IOException
在單獨的進程中執(zhí)行指定的命令和參數(shù)。
這是一個方便的方法。exec(cmdarray) 形式的調(diào)用與調(diào)用 exec(cmdarray, null, null) 的行為方式完全相同。
參數(shù):
cmdarray - 包含要調(diào)用的命令及其參數(shù)的數(shù)組。
添加回答
舉報