Dlaczego „LANG = C; sudo apt-get clean” itp. Jest zalecane?

16

Natknąłem się na tę stronę wiki: Procedura rozwiązywania problemów z Menedżerem pakietów .

W nim były polecenia takie jak:

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

Więc jaki jest cel LANG=C;?

DK Bose
źródło
8
Pamiętaj, że w tym dokumencie niepoprawnie użyto polecenia - powinno być LANG=C commandi nie LANG=C;command. Pierwsza forma wymusza wartość LANGzmiennej środowiskowej na czas, commandpodczas gdy druga forma to tak naprawdę dwa polecenia, w których pierwsza część po prostu ustawia zmienną lokalną (nieeksportowaną), a druga część uruchamia polecenie bez ustawiania wymaganej zmiennej środowiskowej.
Guss
2
@Guss: W rzeczywistości działa również z średnikiem. Dlaczego? Ponieważ LANG jest istniejącą zmienną środowiskową po otwarciu okna terminala i jeśli zmienisz jej wartość jako osobne polecenie, ta wartość będzie efektywną zmienną środowiskową, dopóki nie zmienisz jej ponownie lub proces się nie zakończy.
Gunnar Hjalmarsson
3
@Gunnar - jest niepoprawny: Prawdopodobnie LANGznajduje się w środowisku, więc prawdopodobnie działa z redundantnymi średnikami; ale jest (1) zbędny, ponieważ LANGmiędzy poleceniami nic się nie zmieni . Również sugerowanie komuś, aby uruchamiał polecenia w taki sposób, jest (2) błędne z powodu niepotrzebnie i nieproszonego zmieniającego się środowiska, oraz (3) zapewnia to niepoprawny wzorzec dla każdego niedoinformowanego użytkownika, który później ponownie zastosuje użycie - być może ze zmienną powłoki, która nie jest w środowisko, a tym samym nie ma żadnego wpływu na uruchamiane polecenia, które wymagają poprawnego, być może bezpiecznego działania.
FooF
2
@Braiam Znam składnię, ale ważne jest, aby pamiętać, że jeśli zmienna nie zostanie wyeksportowana, polecenie jej nie zobaczy. LANG jest standardową zmienną środowiskową i dlatego jest domyślnie eksportowana - ale inne zmienne mogą nie być i PO powinien być tego świadomy.
Guss

Odpowiedzi:

26

Jeśli rozwiązujesz problemy, prawdopodobnie opublikujesz swoje wyniki na jakimś forum lub tutaj, wcześniej czy później.

Kiedy tak się dzieje, inni użytkownicy mogą łatwiej zrozumieć dzienniki i dane wyjściowe, jeśli nie są internacjonalizowane.

To znaczy, jeśli używasz francuskiego, chińskiego, hindi lub czegokolwiek jako języka systemowego, w wynikach prawdopodobnie będą używane terminy w tym języku, a to jeszcze bardziej utrudnia zrozumienie, co się dzieje.

Ustawienia regionalne C wymuszają domyślne wyjście (zazwyczaj angielski tylko ASCII).

Sesję rozwiązywania problemów najlepiej rozpocząć od:

export LC_ALL=C

Zamiast ustawiać określone zmienne regionalne lub ustawiać je tylko dla określonego polecenia.

muru
źródło
10

LANG=Cspowoduje, że dane wyjściowe terminala powrócą do domyślnych ustawień regionalnych. Ponieważ ten przewodnik sugeruje wysłanie danych wyjściowych do Launchpada w celu uzyskania pomocy, każą ci to zrobić, aby po wklejeniu inni mogli je przeczytać bez względu na to, jakiego języka zwykle używasz.


źródło
3

Mały dodatek, chociaż prawdopodobnie nie ma zastosowania w przypadku apt, ponieważ uważam go za dość stabilny program:

Niektóre programy notorycznie źle zachowują się, gdy używają innego ustawienia dla LANG (lub przynajmniej innego niż C lub en_US).

Unity miał (nadal ma?) Te problemy (i gry oparte na Unity), Unreal Engine również miał pewne problemy. Również niektóre skrypty kompilacji dla Androida działały poprawnie tylko z LANG = C lub były kompilowane tylko z tą zmienną środowiskową ustawioną w ten sposób.

Może to również pomóc w rozwiązywaniu problemów, ponieważ błąd może nawet nie wystąpić przy tym ustawieniu.

Larkey
źródło