Qual è il significato delle virgolette singole e doppie nelle variabili di ambiente?


19

Ho definito alcune variabili d'ambiente nel mio .profile in questo modo:

MY_HOME="/home/my_user"

ma la variabile non sembra valutare se non rimuovo le virgolette e rinnovo il file. Credo che le virgolette siano necessarie se ci saranno spazi, e le virgolette singole vengono utilizzate se non si desidera scappare. Qualcuno può chiarire il significato delle virgolette singole e doppie nelle definizioni variabili? Che ne dici di tick anteriori e posteriori?

Risposte:


23

Penso che tu sia confuso sulla terminologia.

Una "variabile d'ambiente" è semplicemente una variabile di shell che qualsiasi processo figlio erediterà.

Quello che stai facendo nel tuo esempio è la creazione di una variabile shell. Non è nell'ambiente fino a quando non lo esporti:

MY_HOME="/home/my_user"
export MY_HOME

inserisce una variabile denominata "MY_HOME" in quasi tutte le shell (escluso csh, tcsh).

In questo caso particolare, le doppie virgolette sono superflue. Non hanno alcun effetto. Virgolette doppie tra virgolette di gruppo, ma consente a qualunque shell utilizzata di sostituire le variabili. Sottostringhe di gruppi a virgoletta singola e impedisce la sostituzione. Poiché l'assegnazione di esempio non contiene alcuna variabile, le virgolette doppie potrebbero apparire come virgolette singole.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Nulla è nell'ambiente fino a quando non lo si esporta.


18

Variabili della shell e variabili di ambiente

MY_HOME="/home/my_user"imposta la variabile shell chiamata MY_HOME. Le shell sono linguaggi di programmazione e hanno variabili (chiamate anche parametri). Dopo questa assegnazione, è possibile utilizzare il valore della variabile, ad es echo "$MY_HOME". Con .

Le variabili di shell sono un concetto di shell interno. Quando termina l'istanza della shell, MY_HOMEviene dimenticata. Ciò che ogni programma conosce e trasmette ai propri figli sono le variabili di ambiente .

All'interno della shell, le variabili di ambiente e le variabili di shell funzionano in modo molto simile. Ciò che realmente accade è che tutte le variabili di ambiente che la shell eredita dal suo genitore diventano variabili di shell. Al contrario, una variabile di shell definita in uno script di shell diventerà una variabile di ambiente se la si esporta .

export MY_HOME="/home/my_user"

Maggiori dettagli puoi saltare in prima lettura

Il motivo per cui le variabili di shell non diventano automaticamente variabili di ambiente è in parte il fatto che uno script potrebbe usare accidentalmente un nome di variabile significativo per un programma che avvia e in parte solo storico.

È necessario exportutilizzare alcune shell molto vecchie ogni volta che si modifica un nome di variabile, ma tutte le shell moderne tengono traccia delle assegnazioni per le variabili di ambiente, in modo che il seguente frammento echi bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

Inoltre, alcune shell molto vecchie richiedono comandi separati per myvar=fooe export myvar, ma tutte le shell moderne comprendono export myvar=foo.

È possibile eseguire set -aper fare in modo che tutte le assegnazioni delle variabili della shell esportino automaticamente la variabile, quindi ciò myvar=fooequivale a export myvar=foose si eseguiva set -aprima quella shell.

Su preventivo

La citazione è per lo più ortogonale. Se il valore che stai assegnando alla variabile non contiene caratteri speciali per la shell, non hai bisogno di virgolette. Se sono presenti caratteri speciali, è necessario proteggerli con virgolette singole o doppie virgolette o barre rovesciate o una loro combinazione. Questo vale sia per la myvar=valuesintassi normale che per l' exportutilità.

C'è una differenza tra la sintassi dell'assegnazione e la exportsintassi. La shell espande ulteriormente i risultati delle sostituzioni variabili $foo, eseguendo la suddivisione del campo (parola) e l' espansione del percorso (globbing) . Ciò significa che se il valore di myvarè hello ​ *, quindi echo $myvarstampa helloseguita da un singolo spazio seguito dall'elenco dei file nella directory corrente. Questo non è quasi mai auspicabile, da qui il principio generale per usare sempre le virgolette intorno sostituzioni variabili (a meno che non si sa che avete bisogno di Espansione di percorso o campo di spezzamento): echo "$myvar". Nel caso di una semplice cessione, othervar=$myvarinfatti, copia in modo affidabile il valore di myvaraothervar, poiché il globbing e la divisione delle parole sono inibiti nelle assegnazioni (perché creano più parole, ma è prevista una sola parola). Questa dispensa non si applica export, tuttavia. Quindi, se vuoi ricordare una semplice regola, usa sempre virgolette doppie attorno alle sostituzioni variabili.


Puoi spiegare "La citazione è per lo più ortogonale". nella sezione "Sul preventivo"? Non capisco il significato di ortogonale in quella frase.
DK Bose,

1
@DKBose Significa che le variabili ambiente vs shell da un lato e le citazioni dall'altro sono due problemi separati che hanno poco a che fare l'uno con l'altro. Significati Wikizionario 4 e 5.
Gilles 'SO- smetti di essere malvagio' l'
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.