Quando utilizzare un punto e virgola tra le variabili di ambiente e un comando


14

Qualcuno può spiegare perché il punto e virgola è necessario per LANGessere visto aggiornato da bash?

Non funziona:

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

Lavori:

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

Sto lavorando con Bash 4.1.10 su Linux e la stessa versione su Cygwin

Risposte:


23

Il parametro e altri tipi di espansioni vengono eseguiti quando il comando viene letto, prima che venga eseguito.

La prima versione, LANG=Ja_JP bash -c "echo $LANG"è un singolo comando. Dopo che è stato analizzato come tale, $LANGviene espanso en_USprima che venga eseguito qualsiasi cosa. Una volta bashterminata l'elaborazione dell'input, avvia un processo, si aggiunge LANG=Ja_JPall'ambiente come previsto e quindi viene eseguito bash -c echo en_US.

È possibile impedire l'espansione con virgolette singole, ovvero LANG=Ja_JP bash -c 'echo $LANG'output Ja_JP.

Si noti che quando si dispone di un'assegnazione variabile come parte di un comando, l'assegnazione influisce solo sull'ambiente di quel comando e non su quello della shell.

La seconda versione LANG=Ja_JP; bash -c "echo $LANG"è in realtà due comandi separati eseguiti in sequenza. Il primo è una semplice assegnazione di variabili senza un comando, quindi influisce sulla shell corrente.

Pertanto, i tuoi due frammenti sono fondamentalmente diversi nonostante la distinzione superficiale di un singolo ;.

Completamente fuori tema, ma potrei raccomandare di aggiungere un .UTF-8quando l'impostazione LANG. Al giorno d'oggi non c'è motivo per non utilizzare Unicode nel 21 ° secolo.


Ottima risposta - grazie! Per quanto riguarda l'aggiunta di UTF-8. Sto cercando di testare la gestione delle impostazioni locali di un'applicazione che deve funzionare su diverse piattaforme alcune delle quali sono piuttosto vecchie. Tra differenze come questa (che per fortuna hai spiegato) e differenze su Linux e Cygwin sto per buttarmi sotto un autobus!
Richard Corden,

5

VAR=value; somecommand è equivalente a

VAR=value
somecommand

Questi sono comandi non correlati eseguiti uno dopo l'altro. Il primo comando assegna un valore alla variabile shell VAR. A meno che non VARsia già una variabile d'ambiente, non viene esportata nell'ambiente, rimane interna alla shell. Una dichiarazione export VARverrebbe esportata VARnell'ambiente.

VAR=value somecommandè una sintassi diversa. L'assegnazione VAR=valueè all'ambiente, ma questa assegnazione viene effettuata solo nell'ambiente di esecuzione di somecommand, non per la successiva esecuzione della shell.

A titolo di esempio:

# 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

Non avevo davvero pensato alla differenza tra una shell e una variabile d'ambiente. Dovrò andare a fare delle ricerche. Grazie per la risposta.
Richard Corden,
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.