Gdzie ustawia się zmienną $ LANG w Mac OS X?

24

Użyłem wgetpo raz pierwszy po instalacji Lion OS X i zauważyłem, że wget został zlokalizowany na mój język ojczysty. Uruchomienie setpolecenia w terminalu pokazało, że moja LANGzmienna reprezentuje mój lokalny język. Gdzie mogę to zmienić lub wgetzignorować to ustawienie?

aktualizacja

Oto, co localedaje mi:

LANG="lt_LT.UTF-8"
LC_COLLATE="lt_LT.UTF-8"
LC_CTYPE="lt_LT.UTF-8"
LC_MESSAGES="lt_LT.UTF-8"
LC_MONETARY="lt_LT.UTF-8"
LC_NUMERIC="lt_LT.UTF-8"
LC_TIME="lt_LT.UTF-8"
LC_ALL=

Dlatego wszystkie dane wyjściowe nieparametrów (takich jak monity i komunikaty debugowania) są w języku litewskim. To jest mój problem. Chciałbym wrócić do angielskiego.

Używam zshjako mojej powłoki logowania.

Eimantas
źródło
Z czym dokładnie jest problem wget? A co localepokazuje i czy jest to to samo, czego oczekujesz od wyboru języka w okienku preferencji systemu Język i tekst ?
bmike

Odpowiedzi:

26

Domyślnie Terminal ustawia regionalne zmienne środowiskowe, aby pasowały do ​​aktualnie wybranego języka oraz formatów czasu / daty / liczb używanych przez Terminal, które są wybierane za pomocą

Preferencje systemowe> Język i tekst

(Tak nazywa się Lion. W starszych systemach dokładna nazwa panelu preferencji może się różnić.)

Tymczasowym rozwiązaniem jest przeciągnięcie języka angielskiego na górę listy języków, a następnie otwarcie terminalu, a następnie przeniesienie języka litewskiego z powrotem na górę. Tylko terminal będzie w języku angielskim. Jednak po wyjściu i ponownym uruchomieniu terminalu zostanie zresetowany do litewskiego.

Trwałe podejście polega na mówieniu Terminalowi, aby nie ustawiał zmiennych środowiskowych ustawień regionalnych, poprzez wyłączenie

Terminal> Preferencje> Ustawienia> [profil]> Zaawansowane> Ustaw zmienne środowiskowe locale podczas uruchamiania

Wtedy ustawienia narodowe będą domyślnie ustawione na „C” bez określonego języka, a większość programów będzie wtedy domyślnie ustawiona na angielski.

Zauważ, że wyłączenie tego oznacza, że ​​niektóre programy nie będą wiedziały, jakiego terminala używa kodowanie znaków, i przyjmą, że jest to tylko ASCII lub ISO-Latin-1. Więc jeśli Terminal używa UTF-8 (domyślnie), programy te mogą, ale nie muszą, zachowywać się zgodnie z potrzebami.

Jeśli dotyczy to w większości przypadków wget, zalecamy wykonanie kopii profilu ustawień domyślnych, wyłączenie ustawień regionalnych w profilu niestandardowym i korzystanie z tego profilu tylko podczas używania wget, aby można było nadal korzystać z UTF-8 z pełnym wsparciem podczas korzystania z innych programów, przy użyciu ustawień domyślnych.

Jak wspomnieli inni, możesz również przesłonić początkowe ustawienia regionalne dostarczone przez Terminal w skrypcie uruchamiania powłoki. W przypadku zsh umieść go w ~ / .zshrc. W przypadku bash użyj ~ / .bashrc (a jeśli jeszcze go nie masz, utwórz plik ~ / .bash_profile, który działa ~ / .bashrc).

Zobacz x-man-page: // 1 / locale, aby uzyskać więcej informacji na temat każdej wartości środowiska locale.

Jednakże, jeśli miałbyś tylko unset LANGustawić lub ustawić na „C”, to normalnie dotyczyłoby to wszystkich twoich powłok i programów, podczas gdy przez większość czasu prawdopodobnie chcesz używać UTF-8 i ustawić, aby Terminal ustawiał zmienne ustawień regionalnych, aby pasowały, aby uzyskać najwyższy stopień współpracy, wierności i funkcjonalności.

Dlatego jeśli zamierzasz pójść tą drogą, sugeruję napisanie kodu w celu edycji, a nie zastąpienia wartości początkowych, aby zachować informacje o kodowaniu („UTF-8”) i po prostu wymusić język na angielski, zamiast ustawiać zmienne na „C”.

Na przykład działa to w Zsh i Bash:

# Replace Lithuanian with English
export LANG=${LANG/lt_LT/en_US}

Kiedy LANG="lt_LT.UTF-8"to zmieni to na LANG="en_US.UTF-8". Nie mam wgetmożliwości przetestowania tego, ale to powinno wystarczyć.

Zrobienie tego w ten sposób oznacza, że ​​jeśli zmienisz preferencje kodowania znaków w Terminalu, nie zastąpisz tego w skrypcie uruchamiania powłoki.

Chris Page
źródło
Ładnie wykonane; uogólnić LANGpolecenie redefinicji: echo ${LANG/*./en_US.}zastępuje obecną nazwę kultury en_US niezależnie od tego, co to jest; pracuje w bash, ksh, zsh.
mklement0
7

Jest tu ustawiony ...

wprowadź opis zdjęcia tutaj

Jeśli chcesz uzyskać więcej lub mniej opcji w menu rozwijanym, przejdź do karty Kodowania , aby zobaczyć jeszcze więcej nagród.

bmike
źródło
3
na OS X to ~ / .bash_profile, nie bashrc. Ludzie bardzo się tym pogubili podczas czytania samouczków online.
Enrico Susatyo,
Kurwa, do cholery - dzięki za złapanie tego. Poszedłem nawet na stronę open source i sprawdziłem, czy jabłko wprowadziło zmiany w gnu bash i nadal źle to zrobiłem. (edycja mojej odpowiedzi - dzięki @the_great_monkey)
bmike
4
Terminal tworzy powłoki logowania, które uruchamiają ~ / .bash_profile. Jednak większość dostosowań użytkownika powinna być umieszczona w ~ / .bashrc, aby dotyczyły również powłok nie zalogowanych (np. Podpowłoki), a ~ / .bash_profile powinien uruchamiać ~ / .bashrc, aby dotyczyło to powłok logowania. ~ / .bash_profile jest zazwyczaj w większości pusty i zawiera tylko kod specjalnie dla powłok logowania najwyższego poziomu, których użytkownik nie chce uruchamiać dla podpowłok.
Chris Page
1
„szybki odczyt strony podręcznika pokazuje, że powłoka ustawia tę wartość przy każdym logowaniu” Strona podręcznika użytkownika bash tak mówi, ale Terminal ustawia wartość początkową i nigdy nie widziałem, aby bash ustawiał je, jeśli jeszcze nie zostały ustawione. Jeśli wyłączę preferencję „ustaw środowisko regionalne…”, żadna ze zmiennych nie zostanie ustawiona, a ustawienia regionalne zostaną wyświetlone, LANG=a pozostałe wartości zostaną ustawione domyślnie na "C".
Chris Page
2

Rozwiązałem ten problem, ustawiając język w moim pliku .profile, który ładuje się przy każdym uruchomieniu terminalu.

export LANG="en_US.UTF-8"
export LC_ALL="POSIX"
użytkownik42973
źródło
LC_ALLzastępuje LANG, więc twoje pierwsze polecenie nie przyniesie żadnego efektu.
mklement0
Jest także POSIXrównoważny Ci wcale nie radzi sobie z Unicode.
Sebastian Graf
1

Opierając się bardziej na doświadczeniu Linuksa, jeśli nie chcesz całkowicie zmieniać swojej lokalizacji za pomocą LC_LANG, ale chciałbyś mieć tylko komunikaty systemowe w języku angielskim, powinieneś po prostu ustawić

LC_COLLATE=C    (to have standard sorting in ls, etc)
LC_CTYPE=en_US.UTF-8
dmpogo
źródło
Jest to LC_MESSAGESzmienna kontrolująca, w jakim języku powinny być wyświetlane komunikaty (jeśli są zainstalowane).
mklement0
0

Korzystając z serwera Debian w języku francuskim i klienta bash dla systemu Macsox, „po prostu” musiałem dodać to do mojego pliku .bash_profile w katalogu użytkownika macosx:

eksport LANG = fr_FR.UTF-8

Rozwiązany.

XiangXing
źródło
0

Pozostałe odpowiedzi są poprawne, czyli o Terminalustawieniu na ustawić zmienne środowiskowe locale na starcie i przy użyciu Shell /etc/profile. Jest jednak inny sposób, który warto zrozumieć - zwłaszcza jeśli problem występuje z powodu zdalnego sshlogowania.

OpenSSH (stosowany w systemach Linux, BSD i macOS) może wysyłać zmienne środowiskowe ze środowiska klienta do powłoki uruchamianej przez serwer. Dzieje się tak tylko wtedy, gdy klient jest skonfigurowany do wysyłania ich, a serwer jest skonfigurowany do ich akceptowania. Klient ( ~/.ssh/config) musiałby mieć:

SendEnv LANG LC_*

a server ( /etc/ssh/sshd_config) potrzebowałby:

AcceptEnv LANG LC_*

Jeśli oba są na swoim miejscu, lokalny klient jest propagowany do powłoki logowania na serwerze ssh:

$ ssh me@my-mac locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL=

Wymaganego ustawienia serwera nie ma domyślnie w systemie Snow Leopard ; jest tam w Sierra . Pamiętaj, aby zrestartować serwer SSH po modyfikacji /etc/sshd_config!!!

rozgwiazdy
źródło