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
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.