Cuándo usar un punto y coma entre las variables de entorno y un comando

14

¿Alguien puede explicar por qué el punto y coma es necesario para LANGque bash lo vea como actualizado?

No funciona

> LANG=Ja_JP bash -c "echo $LANG"
en_US

Trabajos:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

Estoy trabajando con bash 4.1.10 en Linux y la misma versión en Cygwin

Richard Corden
fuente

Respuestas:

23

Los parámetros y otros tipos de expansiones se realizan cuando se lee el comando, antes de ejecutarse.

La primera versión, LANG=Ja_JP bash -c "echo $LANG"es un comando único. Después de que se analiza como tal, $LANGse expande en_USantes de que se ejecute nada. Una vez bashque termina de procesar la entrada, se bifurca un proceso, se agrega LANG=Ja_JPal entorno como se esperaba y luego se ejecuta bash -c echo en_US.

Puede evitar la expansión con comillas simples, es decir, LANG=Ja_JP bash -c 'echo $LANG'salidas Ja_JP.

Tenga en cuenta que cuando tiene una asignación variable como parte de un comando, la asignación solo afecta el entorno de ese comando y no el de su shell.

La segunda versión, en LANG=Ja_JP; bash -c "echo $LANG"realidad , son dos comandos separados ejecutados en secuencia. La primera es una asignación de variable simple sin un comando, por lo que afecta a su shell actual.

Por lo tanto, sus dos fragmentos son fundamentalmente diferentes a pesar de la distinción superficial de uno solo ;.

Completamente fuera de tema, pero podría recomendar agregar un .UTF-8al configurar LANG. No hay una buena razón hoy en día para no usar Unicode en el siglo XXI.

jw013
fuente
Gran respuesta, ¡gracias! En cuanto a la adición de UTF-8. Estoy tratando de probar el manejo local de una aplicación que necesita funcionar en varias plataformas, algunas de las cuales son bastante antiguas. ¡Entre las diferencias como esta (que afortunadamente has explicado) y las diferencias en Linux y Cygwin, estoy a punto de tirarme debajo de un autobús!
Richard Corden
5

VAR=value; somecommand es equivalente a

VAR=value
somecommand

Estos son comandos no relacionados ejecutados uno tras otro. El primer comando asigna un valor a la variable de shell VAR. A menos VARque ya sea una variable de entorno, no se exporta al entorno, permanece interna en el shell. Una declaración export VARse exportaría VARal medio ambiente.

VAR=value somecommandEs una sintaxis diferente. La asignación VAR=valuees al entorno, pero esta asignación solo se realiza en el entorno de ejecución de somecommand, no para la ejecución posterior del shell.

A modo de ejemplo:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing
Gilles 'SO- deja de ser malvado'
fuente
Realmente no había pensado en la diferencia entre un shell y una variable de entorno. Tendré que ir a investigar. Gracias por la respuesta.
Richard Corden el