首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Linux 執行命令遠程路徑雙引號轉義問題:改用單引號或轉義雙引號

     編輯:程式設計綜合問答

現象:Java Runtime.exec() 執行 ffmpeg 命令,Windows/Eclipse 正常,Linux 失敗。經調試發現 filepath 兩側雙引號導致參數解析異常。

原命令

Runtime.getRuntime().exec("/home/ffmpeg -i \" \" + filepath + \" \" -y ...");

根本原因

  1. Java exec(String) 會將整個字符串交給 /bin/sh -c 解析。
  2. Shell 解析時,雙引號用於保護參數內的空格。若 filepath 本身無空格,雙引號會作為字面字符傳遞給 ffmpeg,導致其解析路徑帶引號而失敗。
  3. Windows cmd.exe 對引號處理較寬容,故現象不一致。

解決方案

  1. 改用單引號 (Shell 同樣保護空格,不與 Java 雙引號衝突):
    String cmd = "/home/ffmpeg -i '" + filepath + "' -y ...";
        Runtime.getRuntime().exec(cmd);
        
    缺點:filepath 不能包含單引號。
  2. 轉義雙引號 (Java 層面 \\\" → Shell 層面 \"):
    String cmd = "/home/ffmpeg -i \\\"" + filepath + "\\\" -y ...";
        
  3. 使用 ProcessBuilder + 參數列表 (最推薦,完全避免 Shell 解析):
    ProcessBuilder pb = new ProcessBuilder(
        "/home/ffmpeg", "-i", filepath, "-y", "-ab", "32", "-ar", "22050", "-qscale", "10", "-r", "15", "/home/ffmpeg/temp/");
        pb.start();
        
    • 每個參數獨立元素,無需引號、無 Shell 轉義問題。
    • 跨平台行為一致。

最佳實踐

凡涉及外部命令執行,優先使用 ProcessBuilder 參數列表形式,徹底消除引號/空格/特殊字符轉義地獄。

避免字符串拼接命令,用 ProcessBuilder 參數數組,Linux 下 ffmpeg 路徑解析即可正常工作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved