Impostazione delle variabili di ambiente Linux


9

Sto eseguendo Red Hat Linux Enterprise 5; Uso sempre il comando export per impostare le variabili di ambiente.

Esistono altri modi per impostare le variabili di ambiente e quali sono i loro vantaggi / svantaggi?

Risposte:


16

Questo è un estratto dalla pagina man di Bash:

export [-fn] [name [= word]] ...
export -p
I nomi forniti sono contrassegnati per l'esportazione automatica nell'ambiente di comandi eseguiti successivamente. Se viene fornita l'opzione -f, i nomi si riferiscono alle funzioni ...

Se hai solo bisogno della variabile nell'ambiente attuale, non è necessario usare export.

var=value

Modificare:

Senza esportazione: solo ambiente attuale. Con esportazione: ambiente corrente e ambienti secondari.

Ecco una dimostrazione dell'effetto dell'esportazione sulla disponibilità di una variabile in un ambiente figlio e che i cambiamenti nell'ambiente figlio non influiscono sul genitore:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Dopo il primo echo ( echo "parent...") vedi "123" e "456" perché entrambi var1e var2sono attivi nell'ambiente attuale. Non vedi un valore per var3perché non è ancora impostato.

Dopo la riga che inizia " var3=..." non si vede un valore per var1quanto non è stato esportato. Si fa vedere un valore per var2quanto è stato esportato. Si vede un valore per var3perché è stato fissato per l'ambiente figlio unico .

( bash -cequivale a eseguire uno script con il contenuto dell'argomento -cnell'opzione. Uno script o altro eseguibile o, in questo caso, l'argomento bash -cdiventa un figlio dell'ambiente corrente che, di conseguenza, è, ovviamente, il figlio genitore.)

Nello "script" i valori della variabile vengono modificati. Ora genera quei nuovi valori.

Una volta terminato lo "script", l'esecuzione torna all'ambiente padre (la riga di comando in questo caso). Dopo l'ultimo eco, vengono visualizzati i valori originali poiché le modifiche apportate nell'ambiente figlio non influiscono sul padre.


Cosa significa "nell'ambiente attuale"? Script bash corrente o?
George2,

1
Sì, significa "nello script corrente" o "nella sessione interattiva corrente". In questo modo si escludono eseguibili o script eseguiti all'interno dello script corrente o della sessione interattiva. Questo è lo scopo di export: rendere disponibili le variabili per questi ambienti figlio.
In pausa fino a ulteriore avviso.

Trovo alcuni conflitti da quello che hai detto. :-) Hai detto "In modo da escludere eseguibili o script", fai attenzione a "escludi", ma in quello che hai citato, hai citato "I nomi forniti sono contrassegnati per l'esportazione automatica nell'ambiente di comandi eseguiti successivamente". - deve essere "include" (esportato automaticamente o impatto) e non "escludere". Sono confuso, potresti chiarire per favore?
George2,

1
@ George2: vedi la mia risposta modificata per ulteriori informazioni.
In pausa fino a ulteriore avviso.

3

Lo dici tu

Uso sempre il comando export per impostare la variabile d'ambiente

Dal modo in cui lo hai detto, sembra che tu stia davvero cercando di chiedere come fai a far persistere una variabile ambientale. Per fare ciò richiederebbe di inserire la tua export VAR="foo"dichiarazione nel tuo file $ HOME / .bash_profile (se stai usando bash). Se vuoi che la variabile ambientale persista per tutti gli utenti tranne root, quindi aggiungila a / etc / profile. Se vuoi che venga aggiunto anche per l'utente root, impostalo in /root/.bash_profile.

Funzionerà con tutte le shell di login in cui bash è la shell di scelta. Per shell non di accesso, è necessario utilizzare .bashrc. Non ho approfondimenti da offrire per altre shell: D


2
Potresti voler rileggere la sezione della pagina man di Bash in merito a quando questi file vengono acquistati.
In pausa fino a ulteriore avviso.

1
Sì ... Ho confuso l'accesso e l'interattività. Modifica la mia risposta per riflettere. Grazie per la correzione!
Whaley,

"fare in modo che una variabile ambientale persista" - che cosa significa persistere?
George2,

1
"Persistenza" significa che si desidera che questa variabile abbia questo valore ogni volta che viene avviata una shell. Potrebbe essere o meno necessario esportare la variabile a seconda del suo scopo.
In pausa fino a ulteriore avviso.

1
Ciò significa che non l'hai reso persistente. Prova a fare ciò che Whaley ha descritto.
In pausa fino a ulteriore avviso.

1

l'esportazione è il modo più semplice per farlo, quindi perché non lasciarlo a quello?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells

2
La shell Bourne richiede VARIABLE = valore; export VARIABLE
mpez0

1
Anche questo dovrebbe funzionare ...
BloodPhilia,

@BloodPhilia, per bash, solo un modo per impostare la variabile d'ambiente?
George2,

1
@ George2 - Quando usi VARIABLE = value, stai creando una variabile locale che è andata dopo l'esecuzione corrente dello script. Quando si utilizza l'esportazione, i processi figlio ereditano i valori delle variabili dal processo principale. Ad esempio: FOO=BAR; executethisprogram il programma executethisprogramNON conosce il valore della variabile FOO. D'altra parte, quando si utilizza: FOO=BAR; export FOO; executethisprogram il programma executethisprogramconoscerà il valore della variabile FOO.
BloodPhilia,

1
execethisprogram non è un sottoprocesso di "export FOO". È un sottoprocesso (figlio) dello script che lo chiama o la shell interattiva (da riga di comando). export FOOè un comando che contrassegna la variabile in FOOmodo che sia possibile accedervi dai processi figlio del processo di attivazione in cui è stato emesso il comando. Quel genitore può essere uno script o una shell interattiva.
In pausa fino a ulteriore avviso.

1

Puoi anche fare qualcosa del genere:

VAR=val application

Per esempio:

LANG=C ls --help

uscita in inglese.

LANG=pl_PL ls --help

uscita in polacco (se disponibile).

In passato in sh non si poteva fare export VAL = val. Dovevi

VAL=val; export VAL

Sono confuso su "VAR = applicazione val", cosa significa val e cosa significa applicazione?
George2,

2
Questi esempi impostano il valore della variabile per l'ambiente figlio ( ls, ad esempio) senza influire sul valore di quella variabile nell'ambiente (padre) corrente.
In pausa fino a ulteriore avviso.

È l'ambiente infantile di cosa? Sono confuso.
George2,

1
lsè figlio del processo dal quale è stato eseguito. Se scrivo lsal prompt dei comandi, la shell interattiva è il genitore ed lsè il figlio. Se ho uno script che utilizza, lsallora lo script è il genitore ed lsè il bambino.
In pausa fino a ulteriore avviso.
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.