首页 > 解决方案 > Haskell `callProcess` 有时会导致 `locale` 出现问题

问题描述

在一个函数callProcess中用于检查语言环境(之后运行 lualatex 并希望读取语言环境)。

f1 a b = do 
    -- check for locale 
    loc <- callIO $ callProcess "locale" []
    putStrLn "writePDF2text locale " ]

如果一个程序ghci(精确地stack exec ghci)运行,我会得到预期的输出:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

如果它在下面运行stack test,我会得到

locale: Cannot set LC_CTYPE to default locale: No such file or directory
SSG                > locale: Cannot set LC_MESSAGES to default locale: No such file or directory
SSG                > locale: Cannot set LC_ALL to default locale: No such file or directory
SSG                > LANG=en-US
SSG                > LANGUAGE=en_US:en
SSG                > LC_CTYPE="en-US"
SSG                > LC_NUMERIC="en-US"
SSG                > LC_TIME="en-US"
SSG                > LC_COLLATE="en-US"
SSG                > LC_MONETARY="en-US"
SSG                > LC_MESSAGES="en-US"
SSG                > LC_PAPER="en-US"
SSG                > LC_NAME="en-US"
SSG                > LC_ADDRESS="en-US"
SSG                > LC_TELEPHONE="en-US"
SSG                > LC_MEASUREMENT="en-US"
SSG                > LC_IDENTIFICATION="en-US"
SSG                > LC_ALL=en-US

安装相同的程序并在没有Stack.

对这种行为差异有何解释?更重要的是,如何避免该问题并确保调用的下一个进程看到适当的环境?

标签: haskellhaskell-stack

解决方案


在语言环境输出中,带引号的值是自动的,不带引号的值是在环境中设置的。在你的第二次打印中,有这个

LC_ALL=en-US

所以堆栈测试在某处定义了 LC_ALL=en-US,它可能被解释为 latin1 编码。您应该查看定义 LC_ALL 环境变量的内容。

附言

更重要的是,如何避免该问题并确保调用的下一个进程看到适当的环境?

这只是环境变量,因此您需要使用 callProcess 参数或永久使用相应的 API (取消)设置它们


推荐阅读