2010-11-05 64 views
1

我想知道什麼是所有需要轉義的Linux路徑字符。例如,路徑/ home/user1/My Music/song 1.mp3需要在ls命令'ls/home/user1/My \ Music/song \ 1.mp3'的shell中轉義。什麼是所有可能的Linux路徑字符需要轉義

我想編寫一個函數,它接受一個字符串作爲路徑並轉義所有需要的字符。 Scala中我有:

def normalizePath(path: String): String = { 
var normPath = path.replaceAll(" ", "\\\\ ") 
normPath = normPath.replaceAll("\\]", "\\\\]") 
normPath = normPath.replaceAll("\\[", "\\\\[") 

normPath 

}

知道,有更多的字符需要逃逸。此外,這可能可以通過一個命令(更復雜的正則表達式)來完成?

+0

是'字符串正常化(字符串s){回報「\」「+ s +」\「」; }' – Novikov 2010-11-05 03:21:22

+1

爲什麼不首先使用shell呢? – 2010-11-05 03:24:59

+1

答案取決於您計劃使用路徑的位置。例如,如果它要傳遞給shell,那麼你需要轉義shell解釋的特殊字符(可能包括'!','*','?'等,也許取決於shell是什麼正在使用)。如果將路徑放入URL中,則需要轉義不同的字符集,並使用不同的轉義機制(%-encode)。如果您直接使用Linux系統調用的路徑,則根本不需要轉義。 – 2010-11-05 03:49:18

回答

7

你不應該繼續這個。有很多方法可以解決這個問題(例如設置FS環境變量)。只需使用ProcessBuilder類來傳遞命令行參數。

ProcessBuilder proc = new ProcessBuilder("ls", "/home/user1/My Music/song 1.mp3"); 
proc.start(); 
+0

世界的不同!謝謝! – NullPointer0x00 2011-03-02 20:20:51

2

引用字符串比逃避它們更簡單,我想。對於單引號的算法是:

  • 追加一個單引號字符打開
  • 在原始字符串中的每個字符,
    • ,如果它是一個單引號,追加單引號,反斜槓,單報價,單引號(即關閉報價,逃脫追加單引號,重新報價)
    • 否則追加焦炭本身
  • 追加一個單引號字符關閉

所以這很簡單。

但是,我喜歡ProcessBuilder的答案,如果它對你有用,它就更容易。

如果你不需要任何shell功能,只想產生一個進程,完全避免shell是一個性能和安全的勝利。

如果你確實想使用轉義,我建議使用白名單而不是黑名單字符。即逃避任何不是[a-zA-Z0-9_]的東西。除換行符外,任何字符都可以被轉義。反斜槓後跟換行符意味着「刪除反斜槓和換行符」 - 如果在引號之外。在雙引號裏面,我認爲你可以使用反斜線和換行符來換行。在單引號內部,我不認爲你必須(或可以)換行,只需追加換行符。

一個很好的參考,UNIX98規範的 「shell命令行語言」 http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

0

單引號防止shell擴展,因此,所有你需要的是:

def normalizePath(path: String): String = "'" + path.replace("'", "\\'") + "'" 
相關問題