LANG = C befindet sich in einer Reihe von /etc/init.d/* - Skripten. Was macht LANG = C und warum müssen Sie LANG = C setzen.

8

Es ist nicht klar, was es tut oder was es enthält. Ich habe versucht, die Ausgabe von Set und Env zu überprüfen, um zu sehen, auf was C oder LANG an anderen Stellen auf den Systemen eingestellt sind. Es war nichts klar darüber, wie es verwendet oder eingestellt wird. Ich weiß nicht einmal, welche Manpage ich überhaupt lesen soll.

Jede Hilfe hier wäre großartig, wenn ich versuche, die Startskripte auf verschiedenen Linux-Computern zu dekodieren. Wenn jemand eine gute Ressource (Bücher, Dokumentation) empfehlen kann, die bei diesem Prozess helfen würde, wäre das sehr dankbar.

Beispiel für Skripte mit LANG = C auf einem centos6-Computer

$ grep -i LANG = C ./*
./halt:LANG=C __umount_loop '$ 2 ~ / ^ \ / $ | ^ \ / proc | ^ \ / dev / {next}
./netconsole: route = $ (LANG = C ip -o route get to $ host / 32)
./netconsole: arp = $ (LANG = C / sbin / arping -c 1 -I $ DEV $ Ziel 2> / dev / null | awk '/ Antwort von. * [. *] / {print gensub (". * Antwort von. * \\ [(. *) \\]. * "," \\ 1 "," G ")} ')
./netconsole: SYSLOGADDR = $ (LANG = C Host $ SYSLOGADDR 2> / dev / null | awk '/ hat Adresse / {print $ NF}')
./network: LANG = C sed -e "$ __ sed_discard_ignored_files" \
./Netzwerk: LANG = C sort -k 1,1 -k 2n | \.
./network: LANG = C sed 's / //')
./network: eval $ (LANG = C fgrep "DEVICE =" ifcfg- $ i)
./network: eval $ (LANG = C fgrep "TYPE =" ifcfg- $ i)
./network: eval $ (LANG = C fgrep "SLAVE =" ifcfg- $ i)
./network: wenn LANG = C egrep -L "^ ONBOOT = ['\"]? [Nn] [Oo] [' \ "]?" ifcfg- $ i> / dev / null; dann
./network: wenn! LANG = C egrep -L "^ ONBOOT = ['\"]? [Nn] [Oo] [' \ "]?" ifcfg- $ i> / dev / null 2> & 1; dann
./network: eval $ (LANG = C fgrep "DEVICE =" ifcfg- $ i)
./network: eval $ (LANG = C fgrep "TYPE =" ifcfg- $ i)
./rpcbind:# Wir können beim Booten kein Japanisch auf der normalen Konsole verwenden, also erzwinge LANG = C.
./rpcbind: LANG = C.

Beispiel für die Verwendung in Skripten auf einem Ubuntu 10.04-Computer

$ grep -i LANG = C ./*
./apache2:ENV="env -i LANG = C PATH = / usr / local / bin: / usr / bin: / bin "
./exim4:LANG=C
./ntop:export LANG = C \
Nelaaro
quelle
Aus Vorsichtsgründen führt eine Änderung LANG=Cin Ihrer .bashrc(abhängig von Ihrer Shell) zu einem neueren Anmeldeverhalten der GUI-Konsole. Zumindest CentOS 7.6 ist kaputt. (Fragen Sie mich, woher ich das weiß)
Erik Bennett

Antworten:

14

Es erzwingt, dass Anwendungen die Standardsprache für die Ausgabe verwenden, und erzwingt, dass die Sortierung byteweise erfolgt.

$ LANG=es_ES man
¿Qué página de manual desea?
$ LANG=C man
What manual page do you want?
$ LANG=en_US sort <<< $'a\nb\nA\nB'
a
A
b
B
$ LANG=C sort <<< $'a\nb\nA\nB'
A
B
a
b
Ignacio Vazquez-Abrams
quelle
7

Wie bereits erläutert, LANGsteuert die Umgebungsvariable die Lokalisierung.

Es wirkt sich auf viele Standard - Kommandozeilen - Tools wie sort, grep, awk.

Wenn Sie den Wert auf "C" setzen, werden alle diese Tools angewiesen, nur grundlegende ASCII-Zeichen zu berücksichtigen und die UTF-8-Multibyte-Übereinstimmung zu deaktivieren.

Ein weiterer guter Grund für die Verwendung dieser Umgebungsvariablen als die Lokalisierung ist die Leistung: Sie kann grepfür grepVersionen <2.7 1000-mal schneller sein : http://rg03.wordpress.com/2009/09/09/gnu-grep-is-slow-on- utf-8 /

Informationen zum Grund, warum der Buchstabe "C" zur Angabe eines "sicheren " Basisgebietsschemas verwendet wird , finden Sie unter Warum "LANG = C". (nicht D oder E oder F) .

Lucas Cimon
quelle
4

LANG = C ist eine Möglichkeit, die Lokalisierung zu deaktivieren. Es wird in Skripten verwendet, um die Programmausgabe vorherzusagen, die je nach aktueller Sprache variieren kann. Weitere Informationen finden Sie hier

Pablo Castellazzi
quelle