2013-07-05 56 views
2

我想從Haskell運行帶有unicode文件路徑的bash命令。帶有unicode文件路徑的runco​​mmand(haskell)

字符串在Haskell使用\轉義例如

"beißen" -> "bei\223en"

擊似乎接受以下格式:

$'bei\xC3\x9Fen.avi''beißen.avi'

因爲runCommandSystem.Process有型

runCommand :: String -> IO System.Process.Internals.ProcessHandle

如何將Haskell字符串編碼爲Bash接受的格式之一?

使用Mac OSX 10.8.4其中有bash 3.2。

編輯

我的問題似乎在bash逃避

我使用Text.ShellEscapehttp://hackage.haskell.org/packages/archive/shell-escape/0.1.2/doc/html/Text-ShellEscape.html),以逃避需要進行轉義對於bash的人物做

import qualified Data.ByteString.Char8 as B 
import qualified Text.ShellEscape as Esc 
let cmd = B.unpack $ Esc.bytes $ Esc.bash . B.pack $ "beißen.txt" 

這給我"$'bei\\xDFen.txt'"

運行runCommand $ "ls " ++ cmd

它給了我,當 ls: bei�en.txt: No such file or directory

它有沒有更好的方式來逃避對於bash字符串?

+0

'runCommand「echobeißen>>beißen.txt&& catbeißen.txt」'運行正常,有什麼問題? – josejuan

+0

你在試圖運行什麼,你會得到什麼錯誤? –

+0

我又添加了一些信息 –

回答

4

Data.ByteString.Char8幾乎從來都不是正確的選擇,如果你想處理非ASCII文本。它會破壞你的數據。在你的情況下,你可能應該使用Data.ByteString.UTF8(假設你使用UTF-8語言環境,大多數現代桌面Unix-y操作系統都是這樣)。

Data.ByteString.Char8識別碼數據的:

Prelude Data.ByteString.Char8> "été" 
"e\769te\769" 
Prelude Data.ByteString.Char8> unpack $ pack "été" 
"e\SOHte\SOH" 
Prelude Data.ByteString.Char8> Prelude.putStrLn "été" 
été 
Prelude Data.ByteString.Char8> Prelude.putStrLn $ unpack $ pack "été" 
ete 

使用Data.ByteString.UTF8.toString和不Data.ByteString.Char8.unpack

這些調用

let s = toString $ bytes $ bash $ fromString "мама.sh" 
runCommand s 
runCommand $ "ls -l " ++ s 

從ghci的範圍內,我的工作("мама.sh"是在名稱中的一些西裏爾字母一個shell腳本)。

當然,如果你逃脫了整個命令,它也將逃離白色空間,它不會工作。單獨退出命令的每個單詞。