GNU/Linux >> Linux Esercitazione >  >> Linux

La differenza di utilizzo tra variabili Shell e variabili d'ambiente?

In realtà non sapevo che ci sono due diversi tipi di variabili a cui posso accedere dalla riga di comando. Tutto quello che sapevo è che posso dichiarare variabili come:

foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"

o accedendovi con un segno $, come:

echo $foo
echo ${bar[1]}

o utilizzando variabili integrate, come:

echo $PWD
PATH=$PATH:"/usr/bin/myProg"

Ora, ho sentito che ci sono due (almeno?) tipi di variabili:variabili di shell e variabili di ambiente.

  • Qual ​​è lo scopo di avere due tipi diversi?
  • Come faccio a sapere che tipo è una variabile?
  • Quali sono gli usi tipici di ciascuno di essi?

Risposta accettata:

Le variabili d'ambiente sono un elenco di name=value coppie che esistono qualunque sia il programma (shell, applicazione, demone...). Sono in genere ereditati dai processi figli (creati da un fork /exec sequenza):i processi figli ottengono la propria copia delle variabili padre.

Le variabili della shell esistono solo nel contesto di una shell. Vengono ereditati solo nelle sottoshell (cioè quando la shell viene biforcata senza un exec operazione). A seconda delle caratteristiche della shell, le variabili potrebbero non essere solo semplici stringhe come quelle di ambiente, ma anche array, variabili composte e tipizzate come intere o virgola mobile, ecc.

All'avvio di una shell, tutte le variabili di ambiente che eredita dal genitore diventano anche variabili di shell (a meno che non siano valide come variabili di shell e altri casi d'angolo come IFS che viene ripristinato da alcune shell) ma queste variabili ereditate vengono contrassegnate come esportate. Ciò significa che rimarranno disponibili per i processi figlio con il valore potenzialmente aggiornato impostato dalla shell. Questo è anche il caso delle variabili create sotto la shell e contrassegnate come esportate con export parola chiave.

Non è possibile esportare array e altre variabili di tipo complesso a meno che il loro nome e valore non possano essere convertiti nel name=value pattern, o quando è in atto un meccanismo specifico della shell (ad es.:bash esporta funzioni nell'ambiente e alcune shell esotiche non POSIX come rc e es può esportare array).

Quindi la principale differenza tra le variabili di ambiente e le variabili di shell è il loro ambito:le variabili di ambiente sono globali mentre le variabili di shell non esportate sono locali allo script.

Nota anche che le moderne shell (almeno ksh e bash ) supportano un terzo ambito di variabili della shell. Variabili create nelle funzioni con il typeset sono locali a quella funzione (il modo in cui la funzione è dichiarata abilita/disabilita questa funzione in ksh e il comportamento di persistenza è diverso tra bash e ksh ). Vedi https://unix.stackexchange.com/a/28349/2594

Correlati:differenza tra "reg save" e "reg export"?

Questo vale per le shell moderne come ksh , dash , bash e simili. La shell Bourne legacy e le shell sintattiche non Bourne come csh avere comportamenti diversi.


Linux
  1. Differenza tra shell di accesso e shell non di accesso?

  2. La differenza tra un comando integrato e uno che non lo è?

  3. La differenza tra le citazioni "...", '...', $'...' e $"..." In The Shell?

  4. La differenza tra [[ $a ==Z* ]] e [ $a ==Z* ]?

  5. Qual è la differenza tra env e set (su Mac OS X o Linux)?

Qual è la differenza tra Linux e Unix?

Qual è la differenza tra Login e Non-Login Shell

La differenza tra Nss e Pam?

Qual è la differenza tra una console, un terminale e una shell?

Differenza tra '{}' e {} nel comando find?

Qual è la differenza tra ls e l?