Почему рекомендуется «LANG = C; sudo apt-get clean» и т. Д.?


16

Я наткнулся на эту вики-страницу: Процедура устранения неполадок диспетчера пакетов .

В нем были такие команды, как:

LANG=C;sudo apt-get clean
LANG=C;sudo apt-get autoclean
LANG=C;sudo apt-get -f install
LANG=C;sudo apt-get --fix-missing install
LANG=C;sudo apt-get --purge autoremove
LANG=C;sudo apt-get --fix-missing update -o APT::Cache-Limit=100000000
LANG=C;sudo apt-get update -o APT::Cache-Limit=100000000 && sudo apt-get dist-upgrade

Так в чем же цель LANG=C;?



8
Обратите внимание, что этот документ использует команду неправильно - так должно быть LANG=C commandи нет LANG=C;command. Первая форма задает значение LANGпеременной среды на время, commandпока вторая форма фактически является двумя командами, где первая часть просто устанавливает локальную (не экспортируемую) переменную, а вторая часть запускает команду без установки требуемой переменной среды.
Guss

2
@Guss: На самом деле это работает и с точкой с запятой. Почему? Поскольку LANG является существующей переменной среды, когда вы открываете окно терминала, и если вы измените ее значение в качестве отдельной команды, это значение будет эффективной переменной среды, пока вы не измените ее снова или процесс не завершится.
Гуннар Хьялмарссон

3
@Gunnar - это неправильно: вероятно, LANGнаходится в среде, поэтому он, вероятно, работает с избыточными точками с запятой; но это (1) избыточно, потому что LANGмежду командами ничего не изменится . Также (2) неверно указывать кому-либо на выполнение команд таким образом: из-за неоправданно и незваного изменения среды, и (3) это обеспечивает неправильный шаблон для любого неинформированного пользователя, который позже повторно использует использование - возможно, с переменной оболочки, которая не находится в окружающая среда и, следовательно, даже не оказывает никакого влияния на выполнение команд, которые требуют ее для правильной, возможно, безопасной, функции.
FooF

2
@Braiam Я знаком с синтаксисом, но важно отметить, что до тех пор, пока переменная не будет экспортирована, команда ее не увидит. LANG - это стандартная переменная среды, поэтому она экспортируется по умолчанию, но других переменных может и не быть, и OP должен знать об этом.
Guss

Ответы:


26

Если вы устраняете неполадки, вы, скорее всего, опубликуете свои результаты на каком-то форуме или здесь, рано или поздно.

Когда это происходит, другим пользователям гораздо проще понять ваши журналы и вывод, если они не интернационализированы.

То есть, если вы используете французский, китайский, хинди или любой другой в качестве языка вашей системы, в выходных данных, скорее всего, будут использоваться термины на этом языке, и это усложнит понимание того, что происходит.

Локаль C форсирует вывод по умолчанию (обычно английский только для ASCII).

Лучше начинать сеанс устранения неполадок с:

export LC_ALL=C

Вместо того, чтобы устанавливать определенные переменные локали или устанавливать это только для конкретной команды.


10

LANG=Cсделает вывод вашего терминала резервным по умолчанию. Поскольку это руководство предлагает вам отправить выходные данные на Launchpad для поддержки, они просят вас сделать это так, чтобы при вставке они могли читать другие, независимо от того, какой язык вы обычно используете.


3

Небольшое дополнение, хотя оно, вероятно, неприменимо в случае apt, поскольку я считаю его довольно стабильным программным обеспечением:

Известно, что некоторые программы плохо себя ведут при использовании других настроек для LANG (или, по крайней мере, отличаются от C или en_US).

Unity имел (все еще имеет?) Эти проблемы (и игры на основе Unity), Unreal Engine тоже имел некоторые проблемы. Также некоторые из сценариев сборки для Android работали только с LANG = C должным образом или компилировались только с этой переменной среды, установленной таким образом.

Так что это также может помочь в устранении неполадок, так как ошибка может даже не возникать с этим параметром.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.