2 回答

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

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