¿Dónde se establece la variable $LANG en Mac OS X?

Lo usé wgetpor primera vez después de instalar Lion OS X y noté que wget se localizó en mi idioma nativo. Ejecutar el setcomando en la terminal mostró que mi LANGvariable representa mi idioma local. ¿Dónde puedo cambiar esto o hacer que wgetignore esta configuración?

actualizar

Esto es lo localeque me da:

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=

Por lo tanto, todos los resultados de los no parámetros (como avisos y mensajes de depuración) están en lituano. Ese es mi problema. Me gustaría que volviera a estar en inglés.

Estoy usando zshcomo mi shell de inicio de sesión.

¿Cuál es exactamente el problema con wget? ¿Y qué localemuestra y es lo mismo que espera de su selección de idioma en el panel de preferencias del sistema Idioma y texto ?

Respuestas (6)

De forma predeterminada, Terminal establece las variables de entorno locales para que coincidan con el idioma seleccionado actualmente y los formatos de hora/fecha/número que utiliza Terminal, que se selecciona a través de

Preferencias del sistema > Idioma y texto

(Ese es el nombre en Lion. En sistemas anteriores, el nombre exacto del panel de preferencias puede variar).

Una solución temporal es arrastrar el inglés a la parte superior de la lista de idiomas, luego abrir la Terminal y luego volver a colocar el lituano en la parte superior. Entonces solo Terminal estará en inglés. Sin embargo, se restablecerá a lituano si cierra y reinicia la Terminal.

Un enfoque persistente es decirle a Terminal que no establezca las variables de entorno locales, desactivando

Terminal > Preferencias > Configuración > [perfil] > Avanzado > Establecer variables de entorno locales al inicio

Luego, la configuración regional será "C" de manera predeterminada sin especificar un idioma, y ​​la mayoría de los programas tendrán el inglés de manera predeterminada.

Tenga en cuenta que desactivar esto significa que algunos programas no sabrán qué codificación de caracteres está usando Terminal y asumirán que es solo ASCII o ISO-Latin-1. Entonces, si Terminal está usando UTF-8 (el valor predeterminado), esos programas pueden o no comportarse como se desea.

Si se trata principalmente de wget, le recomiendo que haga una copia del perfil de configuración predeterminado, desactive la configuración regional en su perfil personalizado y solo use ese perfil cuando use wget, para que pueda continuar usando UTF-8 con soporte completo. al usar otros programas, usando la configuración predeterminada.

Como han mencionado otros, también puede anular la configuración regional inicial proporcionada por Terminal en un script de inicio de shell. Para zsh, póngalo en ~/.zshrc. Para bash, use ~/.bashrc (y si aún no tiene uno, cree un ~/.bash_profile que ejecute ~/.bashrc).

Consulte x-man-page://1/locale para obtener más información sobre cada uno de los valores del entorno local.

Sin embargo, si simplemente unset LANGlo configurara o lo configurara en "C", eso normalmente se aplicaría a todos sus shells y programas, mientras que la mayoría de las veces probablemente desee usar UTF-8 y hacer que Terminal configure las variables locales para que coincidan, para conseguir el mayor grado de cooperación, fidelidad y funcionalidad.

Por lo tanto, si va a seguir esa ruta, le sugiero que escriba código para editar, en lugar de reemplazar, los valores iniciales, de modo que conserve la información de codificación ("UTF-8") y simplemente fuerce el idioma al inglés. en lugar de establecer las variables en "C".

Por ejemplo, esto funciona en zsh y bash:

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

Cuando LANG="lt_LT.UTF-8", esto lo cambiará a LANG="en_US.UTF-8". No tengo wgetdisponible para probar esto, pero esto debería ser suficiente.

Hacerlo de esta manera significa que si cambia la preferencia de codificación de caracteres en la Terminal, no la anulará en su secuencia de comandos de inicio de shell.

Bien hecho; para generalizar el LANGcomando de redefinición: echo ${LANG/*./en_US.}reemplaza el nombre cultural actual con en_USindependientemente de cuál sea; trabaja en bash, ksh, zsh.

Está puesto aquí...

ingrese la descripción de la imagen aquí

Si desea más o menos opciones en el menú desplegable, diríjase a la pestaña Codificaciones para ver aún más de la recompensa.

en os x es ~/.bash_profile, no bashrc. La gente se confundió mucho con esto al leer tutoriales en línea.
Dios, maldita sea, gracias por captar eso. Incluso fui a la página de código abierto y verifiqué si Apple hizo cambios en gnu bash y aún así me equivoqué. (editando mi respuesta - gracias @the_great_monkey)
Terminal crea shells de inicio de sesión, que ejecutan ~/.bash_profile. Sin embargo, la mayoría de las personalizaciones del usuario deben colocarse en ~/.bashrc para que también se apliquen a los shells que no son de inicio de sesión (por ejemplo, sub-shells), y ~/.bash_profile debe ejecutarse en ~/.bashrc para que se aplique a los shells de inicio de sesión. ~/.bash_profile generalmente está casi vacío y solo contiene código específicamente para shells de inicio de sesión de nivel superior que el usuario no quiere ejecutar para subshells.
"una lectura rápida de la página de manual muestra que el shell establece este valor cada vez que inicia sesión" La página de manual de bash dice eso, pero Terminal establece el valor inicial, y nunca he visto que bash los establezca si no lo están ya. Si desactivo la preferencia "establecer entorno local...", no se establece ninguna de las variables, y se muestra la configuración regional LANG=y los demás valores predeterminados en "C".

Resolví este problema configurando el idioma en mi archivo .profile que se carga cada vez que inicio una terminal.

export LANG="en_US.UTF-8"
export LC_ALL="POSIX"
LC_ALLoverrides LANG, por lo que su primer comando no tendrá efecto.
Además, POSIXes equivalente a Cy eso no hace frente a Unicode en absoluto.

Basado más en la experiencia de Linux, si no desea cambiar su localización completamente con LC_LANG, pero solo desea tener mensajes del sistema en inglés, debe configurar

LC_COLLATE=C    (to have standard sorting in ls, etc)
LC_CTYPE=en_US.UTF-8
Es la LC_MESSAGESvariable que controla en qué idioma deben salir los mensajes (si está instalado).

Las otras respuestas son correctas, es decir, sobre la Terminalconfiguración para establecer las variables de entorno locales en el inicio y el uso del shell /etc/profile. Sin embargo, hay otra forma que vale la pena entender, especialmente si el "problema" se experimenta debido a un inicio de sshsesión remoto.

OpenSSH (como se usa en Linux, BSD y macOS) puede enviar variables de entorno desde el entorno del cliente al shell que inicia el servidor. Solo hace esto si el cliente está configurado para enviarlos y el servidor está configurado para aceptarlos. El cliente ( ~/.ssh/config) necesitaría tener:

SendEnv LANG LC_*

y el servidor ( /etc/ssh/sshd_config) necesitaría:

AcceptEnv LANG LC_*

Si ambos están en su lugar, el local del cliente se propaga al shell de inicio de sesión en el servidor 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=

La configuración de servidor necesaria no existe de forma predeterminada en Snow Leopard ; está allí en la Sierra . ¡Recuerde reiniciar el servidor SSH después de modificar /etc/sshd_config!

Usando un servidor debian en francés y un cliente macsox bash, "simplemente" tuve que agregar esto a mi .bash_profile en el directorio de usuarios de macosx:

exportar LANG=fr_FR.UTF-8

Resuelto.