GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Der Unterschied in der Verwendung zwischen Shell-Variablen und Umgebungsvariablen?

Ich wusste eigentlich nicht, dass es zwei verschiedene Arten von Variablen gibt, auf die ich über die Befehlszeile zugreifen kann. Ich wusste nur, dass ich Variablen deklarieren kann wie:

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

oder mit einem $-Zeichen darauf zugreifen, wie:

echo $foo
echo ${bar[1]}

oder mit eingebauten Variablen, wie:

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

Nun, ich habe gehört, dass es zwei (mindestens?) Arten von Variablen gibt:Shell-Variablen und Umgebungsvariablen.

  • Was ist der Zweck, zwei verschiedene Typen zu haben?
  • Woher weiß ich, welcher Typ eine Variable ist?
  • Was sind die typischen Verwendungen für jeden?

Akzeptierte Antwort:

Umgebungsvariablen sind eine Liste von name=value Paare, die existieren, egal um welches Programm es sich handelt (Shell, Anwendung, Daemon…). Sie werden typischerweise von untergeordneten Prozessen geerbt (erstellt durch einen fork /exec Sequenz):untergeordnete Prozesse erhalten ihre eigene Kopie der übergeordneten Variablen.

Shell-Variablen existieren nur im Kontext einer Shell. Sie werden nur in Subshells vererbt (d.h. wenn die Shell ohne exec geforkt wird Betrieb). Abhängig von den Shell-Eigenschaften können Variablen nicht nur einfache Zeichenfolgen wie Umgebungsvariablen sein, sondern auch Arrays, zusammengesetzte, typisierte Variablen wie Ganzzahlen oder Gleitkommazahlen usw.

Wenn eine Shell startet, werden alle Umgebungsvariablen, die sie von ihrem übergeordneten Element erbt, auch zu Shell-Variablen (es sei denn, sie sind als Shell-Variablen und andere Sonderfälle wie IFS ungültig die von einigen Shells zurückgesetzt wird), aber diese geerbten Variablen werden als exportiert gekennzeichnet. Das bedeutet, dass sie für untergeordnete Prozesse mit dem möglicherweise aktualisierten Wert, der von der Shell festgelegt wird, verfügbar bleiben. Das ist auch bei Variablen der Fall, die unter der Shell erstellt und mit export als exportiert markiert wurden Schlüsselwort.

Array-Variablen und andere komplexe Typvariablen können nicht exportiert werden, es sei denn, ihr Name und Wert kann in name=value konvertiert werden Muster oder wenn ein Shell-spezifischer Mechanismus vorhanden ist (z. B.:bash exportiert Funktionen in der Umgebung und einige exotische Nicht-POSIX-Shells wie rc und es kann Arrays exportieren).

Der Hauptunterschied zwischen Umgebungsvariablen und Shell-Variablen ist also ihr Gültigkeitsbereich:Umgebungsvariablen sind global, während nicht exportierte Shell-Variablen lokal für das Skript sind.

Beachten Sie auch, dass moderne Shells (mindestens ksh und bash ) unterstützen einen dritten Shell-Variablenbereich. Variablen, die in Funktionen mit dem typeset erstellt wurden Schlüsselwörter sind lokal zu dieser Funktion (Die Art und Weise, wie die Funktion deklariert ist, aktiviert/deaktiviert diese Funktion unter ksh , und das Persistenzverhalten unterscheidet sich zwischen bash und ksh ). Siehe https://unix.stackexchange.com/a/28349/2594

Verwandte:Unterschied zwischen „reg save“ und „reg export“?

Dies gilt für moderne Shells wie ksh , dash , bash und ähnliches. Die ältere Bourne-Shell und Nicht-Bourne-Syntax-Shells wie csh haben unterschiedliche Verhaltensweisen.


Linux
  1. Was ist der Unterschied zwischen Sudo Su – und Sudo Su –?

  2. Was ist der Unterschied zwischen env und set (unter Mac OS X oder Linux)?

  3. Was ist der Unterschied zwischen nohup und kaufmännischem Und?

  4. Was ist der Unterschied zwischen &> und >&in bash?

  5. Was ist der Unterschied zwischen unlink und rm?

Was ist der Unterschied zwischen Linux und Unix?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Der Unterschied zwischen Nss und Pam?

Was ist der Unterschied zwischen einer Konsole, einem Terminal und einer Shell?

Unterschied zwischen '{}' und {} im Find-Befehl?

Was ist der Unterschied zwischen ls und l?