Wenn ich beispielsweise eineParametererweiterung:
$ b=1
$ echo $b
1
Wo wird es b
intern gespeichert? Ich habe es überprüft und es ist keine Umgebungsvariable, da es nicht aufgelistet ist printenv
. Ich schreibe meine eigene Shell, um Unix zu lernen, und ich habe eine Hashtabelle verwendet, um Variablen als „Symbol-Lookup-Tabelle“ zu speichern und abzurufen. Ist diese Methode gut oder würden Sie mir eine andere Methode vorschlagen?
Antwort1
Die Shell, die ausgeführt wird, wenn Sie sich anmelden, um Ihre Befehle zu lesen und auszuführen, behält alle Variablen. Wenn Sie eine zweite Shell ausführen, verfügt diese über eine eigene Variablensammlung. Sie können den set
Befehl ausführen, um eine Liste der Variablen anzuzeigen. Der set
Befehl wird innerhalb der Shell ausgeführt, anstatt einen neuen Prozess zu starten.
Umgebungsvariablen werden entweder an einer separaten Stelle gespeichert oder als solche gekennzeichnet (wenn dies wichtig ist, lesen Sie den Shell-Quellcode), sodass sie an die von der Shell ausgeführten Programme weitergegeben werden.
Die Verwendung von zwei Hashtabellen erscheint mir sinnvoll.
Antwort2
Es ist nur eine Variable für die Dauer der Programmausführung. Eine andere Möglichkeit, darüber nachzudenken, besteht darin, Ihr Programm wie folgt umzuschreiben.
#!/bin/bash
b=1
echo $b
exit
Stellen Sie sich nun vor, Sie tun dies in einem Terminal und beenden dann diese Terminalsitzung. Wenn Sie eine weitere Terminalsitzung öffnen, wird Ihnen nicht angezeigtirgendetwasbezüglich dieser b=1
Aufgabe in der vorherigen Sitzung.
Dies wird als „lokale Variable“ bezeichnet, im Gegensatz zu einer „globalen Variable“. Sie werden, wie viele andere Funktionen auch, mit angezeigt set
.
Wenn Sie also die Aufgabe sehen möchten,
set |grep '^b='
b=1
Bitte beachten SieDas Linux Documentation Projectfür mehr Informationen.
Antwort3
Shellvariablen werden im Speicher der laufenden Shell gespeichert. Verwenden Sie eine beliebige Datenstruktur, mit der Sie ein Element anhand seines Namens leicht nachschlagen können. Eine Hash-Tabelle ist eine gute Wahl.
Der Unterschied zwischen Shell-Variablen und Umgebungsvariablen besteht darin, dass Umgebungsvariablen in der Umgebung von Unterprozessen platziert werden. Alle Umgebungsvariablen sind Shell-Variablen. Die natürliche Art, sie zu speichern, besteht darin, eine Hash-Tabelle zu erstellen, die Variablennamen nicht einem Wert, sondern einer Struktur zuordnet, die einen Wert und einige Flags (exportiert, schreibgeschützt, …) enthält.