【问题标题】:runcommand (haskell) with unicode file paths带有 unicode 文件路径的 runco​​mmand (haskell)
【发布时间】: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.ProcessrunCommand 具有类型

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


【解决方案1】:

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 脚本)。

当然,如果您转义整个命令,它也会转义空白,并且它将不起作用。单独转义命令的每个单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2012-09-22
    • 2012-04-14
    • 2011-05-13
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多