haskell - 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
.
对这种行为差异有何解释?更重要的是,如何避免该问题并确保调用的下一个进程看到适当的环境?
解决方案
在语言环境输出中,带引号的值是自动的,不带引号的值是在环境中设置的。在你的第二次打印中,有这个
LC_ALL=en-US
所以堆栈测试在某处定义了 LC_ALL=en-US,它可能被解释为 latin1 编码。您应该查看定义 LC_ALL 环境变量的内容。
附言
更重要的是,如何避免该问题并确保调用的下一个进程看到适当的环境?
这只是环境变量,因此您需要使用 callProcess 参数或永久使用相应的 API (取消)设置它们
推荐阅读
- mysql - 计算已经过去了多少个工作日
- mysql - 返回第二列不唯一的 ID。
- paypal - 贝宝支付沙盒账户问题,状态为 UNCLAIMED
- r - 从谷歌驱动器下载电子表格时出现问题的 GoogleAuthR 包
- regex - 什么是正则表达式来匹配正文中的两组单词
- php - 使用 Laravel Nova 进行图像干预
- codeigniter - codeigniter如何存储实时数据
- sql - 根据另一列的值设置列值
- python - Curve_fit 错误 - IndexError:只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效索引
- kubernetes - 无法从普罗米修斯获取指标