【发布时间】:2013-07-03 13:55:46
【问题描述】:
我想从 Haskell 运行一个具有 unicode 文件路径的 bash 命令。
Haskell 中的字符串使用 \escapes e.g
"beißen" -> "bei\223en"
Bash 似乎接受以下格式:
$'bei\xC3\x9Fen.avi' 和 'beißen.avi'
因为来自System.Process 的runCommand 具有类型
runCommand :: String -> IO System.Process.Internals.ProcessHandle
如何将 Haskell 字符串编码为 Bash 接受的格式之一?
使用具有 bash 3.2 的 Mac OSX 10.8.4。
编辑
我的问题似乎与 bash 转义有关
我正在使用Text.ShellEscape (http://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 转义字符串吗?
【问题讨论】:
-
runCommand "echo beißen >> beißen.txt && cat beißen.txt"运行良好,有什么问题? -
你想运行什么,你遇到了什么错误?
-
我添加了更多信息
-
@Bilal 是否将导入从“导入合格的 Data.ByteString.Char8 作为 B”更改为“导入合格的 Data.ByteString.*UTF*8 作为 B”并用 fromString/toString 替换 pack/unpack帮助? (你可能需要从hackage安装utf8-string包)
-
@ThomasM.DuBuisson:你需要先转义字符串,
Text.ShellEscape想要一个字节串(bash是这个包中的一个函数)。这可能在不止一个方面存在根本性的错误,但这就是我们目前所拥有的。
标签: bash haskell unicode normalization unicode-normalization