首頁 >Java >java教程 >為什麼`Runtime.exec(String)`有時無法正確執行指令?

為什麼`Runtime.exec(String)`有時無法正確執行指令?

Susan Sarandon
Susan Sarandon原創
2024-12-05 22:22:10456瀏覽

Why Does `Runtime.exec(String)` Sometimes Fail to Execute Commands Correctly?

為什麼 Runtime.exec(String) 對某些指令的行為不同?

Runtime.exec(String) 允許執行以下命令底層作業系統的環境。然而,雖然它對某些命令無縫工作,但其他命令會出現問題。

為什麼會有差異?

關鍵差異源自於命令不執行的事實在 shell 環境中。 shell 提供了 Runtime.exec(String) 未執行的基本服務,從而導致錯誤。

失敗何時發生?

指令在依賴時失敗關於shell 功能,例如:

  • 正確拆分引號和空格: Runtime.exec(String) 天真地在空格上分割,這可以將“My File.txt”等參數分解為單獨的檔案名稱。
  • 擴充通配符和通配符: shell 將 *.doc 等模式重寫到實際檔案中。 Runtime.exec(String) 不會執行此擴充功能。
  • 處理管道和重定向: shell 設定輸出重定向,Runtime.exec(String) 不處理該輸出重定向。
  • 擴充變數與指令: shell 在執行指令之前取代 shell 變數和指令。 Runtime.exec(String) 會以字面意思傳遞它們。

解決方案

處理這種情況有兩種方法:

委託給Shell(簡單但草率):

將指令傳遞到shell(例如,使用Runtime.exec(String[])):

String myCommand = "cp -R '" + myFile + "' $HOME 2> errorlog";
Runtime.getRuntime().exec(new String[] { "bash", "-c", myCommand });

承擔Shell 職責(安全與安全)健全):

使用ProcessBuilder來處理類似shell 的任務,例如變數擴展、重定向和分詞:

String myFile = "some filename.txt";
ProcessBuilder builder = new ProcessBuilder(
    "cp", "-R", myFile,
    System.getenv("HOME")
);
builder.redirectError(ProcessBuilder.Redirect.to(new File("errorlog")));
builder.start();

以上是為什麼`Runtime.exec(String)`有時無法正確執行指令?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn