Dove viene impostata la variabile $ LANG in Mac OS X?


24

L'ho usato wgetper la prima volta dopo l'installazione di Lion OS X e ho notato che wget è stato localizzato nella mia lingua madre. L'esecuzione del setcomando nel terminale ha mostrato che la mia LANGvariabile rappresenta la mia lingua locale. Dove posso cambiarlo o far wgetignorare questa impostazione?

aggiornare

Ecco cosa localemi dà:

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=

Quindi tutto l'output di non parametri (come prompt e messaggi di debug) è in lituano. Questo è il mio problema Vorrei riportarlo in inglese.

Sto usando zshcome shell di accesso.


Qual è esattamente il problema wget? E cosa localemostra ed è lo stesso di quello che ti aspetti dalla selezione della lingua nel pannello delle preferenze del sistema Lingua e testo ?
bmike

Risposte:


26

Per impostazione predefinita, Terminale imposta le variabili di ambiente della locale in modo che corrispondano alla lingua e ai formati di ora / data / numero correntemente selezionati utilizzati da Terminale, che è selezionato tramite

Preferenze di Sistema> Lingua e testo

(Questo è il nome su Lion. Sui sistemi precedenti il ​​nome esatto del pannello delle preferenze può variare.)

Una soluzione temporanea è trascinare l'inglese in cima all'elenco delle lingue, quindi aprire Terminale, quindi spostare il lituano di nuovo in cima. Quindi solo il terminale sarà in inglese. Tuttavia, verrà ripristinato in lituano se si esce e si riavvia Terminal.

Un approccio persistente è dire a Terminal di non impostare le variabili di ambiente della locale, disattivando

Terminale> Preferenze> Impostazioni> [profilo]> Avanzate> Imposta le variabili di ambiente della locale all'avvio

Quindi l'impostazione internazionale verrà impostata su "C" senza la lingua specificata e la maggior parte dei programmi verrà impostata automaticamente sull'inglese.

Si noti che la disattivazione significa che alcuni programmi non saranno consapevoli di quale codifica dei caratteri sta utilizzando Terminal e supporranno che sia solo ASCII o ISO-Latin-1. Pertanto, se Terminal utilizza UTF-8 (impostazione predefinita), tali programmi potrebbero o meno comportarsi come desiderato.

Se si tratta principalmente di wget, ti consiglio di fare una copia del profilo delle impostazioni predefinite, disattivare le impostazioni locali nel tuo profilo personalizzato e utilizzare quel profilo solo quando lo usi wget, in modo che tu possa continuare a usare UTF-8 con pieno supporto quando si utilizzano altri programmi, utilizzando le impostazioni predefinite.

Come altri hanno già detto, è anche possibile sovrascrivere le impostazioni locali iniziali fornite da Terminal in uno script di avvio della shell. Per zsh, mettilo in ~ / .zshrc. Per bash, usa ~ / .bashrc (e se non ne hai già uno, crea un ~ / .bash_profile che esegue ~ / .bashrc).

Vedere x-man-page: // 1 / locale per ulteriori informazioni su ciascuno dei valori dell'ambiente locale.

Tuttavia, se dovessi semplicemente unset LANGo impostarlo su "C", ciò si applicherebbe normalmente a tutte le tue shell e programmi, mentre la maggior parte delle volte probabilmente vorrai usare UTF-8 e far sì che Terminal imposti le variabili locali in modo che corrispondano, per ottenere il massimo grado di collaborazione, fedeltà e funzionalità.

Pertanto, se hai intenzione di seguire questa strada, ti suggerisco di scrivere il codice per modificare, anziché sostituire, i valori iniziali, in modo da preservare le informazioni di codifica ("UTF-8") e forzare semplicemente la lingua in inglese, anziché impostare le variabili su "C".

Ad esempio, questo funziona in zsh e bash:

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

Quando LANG="lt_LT.UTF-8", questo cambierà in LANG="en_US.UTF-8". Non ho a wgetdisposizione per testare questo, ma questo dovrebbe essere sufficiente.

Farlo in questo modo significa che se si modifica la preferenza di codifica dei caratteri in Terminale, non lo si sostituirà nello script di avvio della shell.


Ben fatto; generalizzare il LANGcomando di ridefinizione: echo ${LANG/*./en_US.}sostituisce l'attuale nome della cultura en_US indipendentemente da ciò che è; lavori in bash, ksh, zsh.
mklement0

7

È impostato qui ...

inserisci qui la descrizione dell'immagine

Se desideri più o meno opzioni nel menu a discesa, vai alla scheda Encodings per visualizzare ancora di più la taglia.


3
su os x è ~ / .bash_profile, non bashrc. Le persone ne sono rimaste molto confuse quando leggono tutorial online.
Enrico Susatyo,

Accidenti, grazie per averlo scoperto. Sono anche andato alla pagina open source e ho verificato se apple ha apportato modifiche a gnu bash e ho ancora sbagliato. (modificando la mia risposta - grazie @the_great_monkey)
bmike

4
Il terminale crea shell di login, che eseguono ~ / .bash_profile. Tuttavia, la maggior parte delle personalizzazioni degli utenti dovrebbe essere collocata in ~ / .bashrc in modo che si applichino anche alle shell non di accesso (ad es. Sotto-shell) e ~ / .bash_profile dovrebbe eseguire ~ / .bashrc in modo che si applichi alle shell di accesso. ~ / .bash_profile è generalmente vuoto e contiene solo codice specifico per le shell di login di livello superiore che l'utente non vuole eseguire per le sub-shell.
Chris Page

1
"una rapida lettura della pagina man mostra che la shell imposta questo valore ogni log in" La pagina man bash dice questo, ma Terminal imposta il valore iniziale e non ho mai visto bash impostarli se non erano già impostati. Se disattivo la preferenza "imposta ambiente locale ...", nessuna delle variabili viene impostata e le impostazioni locali vengono visualizzate LANG=e gli altri valori sono tutti predefiniti "C".
Chris Page

2

Ho risolto questo problema impostando la lingua nel mio file .profile che si carica ogni volta che avvio un terminale.

export LANG="en_US.UTF-8"
export LC_ALL="POSIX"

LC_ALLsostituisce LANG, quindi il tuo primo comando non avrà alcun effetto.
mklement0

Inoltre, POSIXequivale a Ce che non affronta affatto Unicode.
Sebastian Graf,

1

Basato maggiormente sull'esperienza Linux, se non si desidera modificare completamente la localizzazione con LC_LANG, ma si desidera semplicemente avere messaggi di sistema in inglese, è sufficiente impostare

LC_COLLATE=C    (to have standard sorting in ls, etc)
LC_CTYPE=en_US.UTF-8

È la LC_MESSAGESvariabile che controlla in quale lingua devono essere emessi i messaggi (se installati).
mklement0

0

Usando un server debian in francese e un client bash macsox, ho "solo" dovuto aggiungere questo al mio .bash_profile nella directory utente di macosx:

export LANG = fr_FR.UTF-8

Risolto.


0

Le altre risposte sono corrette, vale a dire Terminalsull'impostazione delle variabili di ambiente delle impostazioni locali all'avvio e sull'uso della shell /etc/profile. Tuttavia, c'è un altro modo che vale la pena comprendere, soprattutto se si verifica il "problema" a causa di un sshaccesso remoto .

OpenSSH (utilizzato su Linux, BSD e macOS) può inviare variabili di ambiente dall'ambiente del client alla shell avviata dal server. Lo fa solo se il client è configurato per inviarli e il server è configurato per accettarli. Il client ( ~/.ssh/config) dovrebbe avere:

SendEnv LANG LC_*

e il server ( /etc/ssh/sshd_config) avrebbe bisogno di:

AcceptEnv LANG LC_*

Se sono presenti entrambi, il locale del client viene propagato nella shell di accesso sul server 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=

L'impostazione del server richiesta non è presente per impostazione predefinita su Snow Leopard ; è lì sulla Sierra . Ricorda di riavviare il server SSH dopo aver modificato /etc/sshd_config!!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.