Haskell `callProcess` иногда вызывает проблемы с` locale` - PullRequest
1 голос
/ 20 июня 2020

В функции 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.

Есть ли объяснение этой разнице в поведении? Что еще более важно, как избежать проблемы и убедиться, что следующий вызываемый процесс видит правильную среду?

1 Ответ

1 голос
/ 21 июня 2020

В выводе локали значения в кавычках автоматически c, значения без них устанавливаются в среде. Во втором отпечатке это

LC_ALL = en-US

Итак, тест стека определяет LC_ALL = en-US где-то, что, вероятно, интерпретируется как кодировка latin1. Вам следует посмотреть, что определяет переменную среды LC_ALL.

Ps

Более важно, как избежать проблемы и убедиться, что следующий вызываемый процесс видит правильную среду?

Это всего лишь переменные среды, поэтому вам нужно (отменить) установить их либо с помощью аргументов callProcess, либо навсегда с помощью соответствующего API

...