今天寫了一個格式轉換的工具,使用下面cmd進行格式轉換操作
Runtime.getRuntime().exec("/home/ffmpeg -i \" "+filepath+ "\" -y -ab 32 -ar 22050 -qscale 10 -r 15 /home/ffmpeg/temp/")
代碼在eclipse和Windows控制台上跑都可以成功完成,但是在linux上面總是出問題,
將生成的命令復制到linux單獨執行,卻可以執行成功,
最後進過半天的調試,發現是filepath 兩邊的_ 雙引號 _的問題,
除去雙引號,程序可以正常執行了,有木有大神能說說原因啊,
----------------linux小白
命令參數含有引號,作為字符串本身傳遞給java又要加引號,需要考慮引號的逃逸。
或者從上到下說
1. Java exec本身的參數是一個字符串;
2. 由於這個串本身不是命令,而是命令和參數的混合體,肯定通過bash -c "cmd"的形式傳遞給bash,這裡又是一層引號;
3.命令的某個參數(文件名)可能含有空格,所以從bash的角度,需要用引號把參數保護起來。
把引號去掉變ok,這是碰巧:如果文件名裡含有空格(如果允許的話),那一樣會報錯。可以驗證一下。
原始命令的\"應該是出於這個目的才存在的。
最簡單的作法,由於bash既接受單引號也接受雙引號來包含參數,把雙引號換成單引號就可以了,這樣就不需要\"來保護了。
當然其缺陷是filepath中不能包含單引號。
復雜點的作法,把\"替換為\\",增加一層逃逸(注意兩邊都要有)。但它同樣有filepath不能有雙引號的問題。