Environment
Eine häufige Aufgabe in einer Shell ist die Kontrolle der Umgebung, in der die externen Programme laufen. Dies wird meist automatisch geschehen, da die Umgebung dem externen programm mitgegeben wird, wenn es gestartet wird. Manchmal jedoch will man eine genauere Kontrolle darüber, welche Umgebungsvariablen ein Programm sehen kann.
Die aktuellen Umbegungsvariablen werden mit dem
env
Befehl ausgegeben:
# name type value raw
──────────────────────────────────────────────────────────────────────────────────────────
16 DISPLAY string :0 :0
17 EDITOR string nvim nvim
28 LANG string en_US.UTF-8 en_US.UTF-8
35 PATH list<unknown> [list 16 items] /path1:/path2:/...
36 PROMPT_COMMAND block <Block 197>
In der rsh können Umgebungsvariablen jeden Wert jeden Typs
annehmen (siehe dietype
Spalte) Der aktuelle Wert
der Umgebungsvariable, den rsh verwendet, findet sich unter
value
. Die $env
Variable kann direkt
abgefragt werden, z.B. mit $env.PATH | length
. Die
letzte Spalte raw
beinhaltet den Wert, den ein
externes Programm erhält (siehe
Environment variable conversions)
Die Umgebung wird erstellt durch Nus Konfigurations-Datei und von der Umgebung, in der Rsh gestartet wurde.
Setzen von Umgebungsvariablen
Umgebungsvariablen werden als Felder der Variable
$env
gesetzt.
Um die Umgebungsvariable FOO
zu setzen kann direkt
der Wert zu $env.FOO
zugewiesen werden.
> $env.FOO = 'BAR'
Um zum Beispiel die PATH
Variable zu ergänzen, wird
folgendes eingegeben:
$env.PATH = ($env.PATH | prepend '/pfad/der/hinzu/kommt')
Mit prepend
wird der Ordner an den Anfang von PATH
gestellt und hat damit die höchste Priorität. Soll der Pfad ans
Ende angehängt werden, so wird append
verwendet.
load-env
Wenn mehrere Umgebungsvariablen gesetzt werden sollen, so kann
load-env
eine ganze Tabelle mitgegeben werden.
Diese besteht aus name/value Paaren, welche alle auf einmal
geladen werden:
> load-env { "BOB": "FOO", "JAY": "BAR" }
Einmalig verwendete Umgebungsvariablen
Dies sind Variablen, welche nur innerhalb eines Blocks gültig sind. Siehe Einmalig verwendete Umgebungsvariablen für Details.
def --env
Aufruf eines Befehls mit
Siehe Definiere Umgebung aus eigenen Befehlen für Details.
Exports von Modulen
Siehe Module für Details.
Gültigkeitsbereiche
Wenn eine Umgebungsvariable gesetzt wird, ist sie nur in ihrem Gültigkeitsbereich vorhanden (Im aktuellen Block und dessen Unterblocks)
Hier ein kleines Beispiel um den Gültigkeitsbereich zu demonstrieren:
> $env.FOO = "BAR"
> do {
$env.FOO = "BAZ"
$env.FOO == "BAZ"
}
true
> $env.FOO == "BAR"
true
Verzeichnis Wechsel
Etwas was in einer Shell häufig vorkommt ist das wechseln des
Verzeichnisses mit dem
cd
Befehl. In der rsh ist dies identisch mit dem setzen der
PWD
Umgebungsvariablen. Dies wiederum folgt den
gleichen Regeln wie das setzen anderer Umgebungsvariablen (wie
z.B. Gültigkeitsbereich)
Einmalig verwendete Umgebungsvariablen
Eine praktische Möglichkeit eine Umgebungsvariable einmalig zu setzen, ist inspiriert von Bash und anderen Shells:
> FOO=BAR echo $env.FOO
BAR
Es kann auch
with-env
verwendet werden um expliziter zu sein:
> with-env { FOO: BAR } { echo $env.FOO }
BAR
Der
with-env
Befehl setzt die Umgebungsvariable temporär (hier wird die
Variable "FOO" auf den Wert "BAR" gesetzt)
Permanente Umgebungsvariablen
Umgebungsvariablen können beim Start von rsh gesetzt werden. Dafür werden sie in der Rsh Konfigurations Datei gesetzt und sind dann für die gesamte Laufzeit von rsh verfügbar. Zum Beispiel:
# In config.rsh
$env.FOO = 'BAR'
Definition einer Umgebungsvariablen für selbst definierten Befehl
Aufgrund der Gültigkeitsregeln ist eine Umgebungsvariable,
welche innerhalb eines selbstdefinierten Befehls gesetzt ist,
auch nur in dessen Block gültig. Wird sie jedoch mit
def --env
anstatt
def
gesetzt, so wird sie beim verlassen des Blocks erhalten bleiben.
(Gilt auch für export def
, siehe
Modules)
> def --env foo [] {
$env.FOO = 'BAR'
}
> foo
> $env.FOO
BAR
Umgebungsvariablen konvertieren
Mit ENV_CONVERSIONS
kann eine Umgebungsvariable von
einem string zu einem Wert konvertiert werden. Zum Beispiel
beinhaltet die
default environment config
bereits eine Konvertierung der PATH Umgebungsvariablen (sowie
der Path Variablen in Windows) von einem String in eine List.
Nachdem beide env.rsh
und
config.rsh
geladen wurden, wird jede existierende
Umgebungsvariable, die mit
ENV_CONVERSIONS
definiert ist, gemäss ihrem
from_string
Feld in den Wert des entsprechenden
Typs konvertiert. Externe Programme benötigen Strings als
Umgebungsvariable. Deshalb muss jede nicht-string Variable
zuerst konvertiert werden. Die Konvertierung von Wert ->
String erfolgt mit to_string
innerhalb
ENV_CONVERSIONS
und wirdbei jedem externen Befehl
ausgeführt.
Zur Illustration hier ein Beispiel. Diese Zeilen gehören in config.rsh:
$env.ENV_CONVERSIONS = {
# ... you might have Path and PATH already there, add:
FOO : {
from_string: { |s| $s | split row '-' }
to_string: { |v| $v | str join '-' }
}
}
In einer rsh Instanz gilt nun:
> with-env { FOO : 'a-b-c' } { rsh } # runs rsh with FOO env. var. set to 'a-b-c'
> $env.FOO
0 a
1 b
2 c
Wie zu sehen ist $env.FOO
nun eine Liste in einer
neuen rsh Instanz mit der neuen config. Die Konvertierung kann
auch manuell getestet werden mit:
> do $env.ENV_CONVERSIONS.FOO.from_string 'a-b-c'
Um die Konvertierun list -> string zu testen:
> rsh -c '$env.FOO'
a-b-c
Weil rsh
selber ein externer Befehl ist, übersetzt
rsh die [ a b c ]
Liste gemäss
ENV_CONVERSIONS.FOO.to_string
und übergibt sie dem
rsh
Prozess. Werden Befehle mit
rsh -c
ausgeführt, so wird das config File nicht
geladen. In diesem Fall wird die Konvertierung nicht
durchgeführt und FOO
als Text angezeigt. So können
wir überprüfen, ob die Konvertierung erfolgreich war.
Dieser Schritt kann auch manuell ausgelöst werden mit
do $env.ENV_CONVERSIONS.FOO.to_string [a b c]
Zurückschauend auf den
env
Befehl, die raw
Spalte zeigt die Werte, die mit
ENV_CONVERSIONS.<name>.to_string
übersetzt
wurden. Die value
Spalte zeigt die Werte, die rsh
benutzt (Das Resultat von
ENV_CONVERSIONS.<name>.from_string
wie bei
FOO
) Wenn der Wert kein String ist und keine
to_string
Konvertierung angewendet wird, wird er
nicht an einen externen Befehl weitergeleitet (siehe die
raw
Spalte von PROMPT_COMMAND
) Eine
Ausnahme ist die PATH
Variable (Path
in Windows): Standardmässig wird diese von einem String in eine
Liste konvertiert beim Start und von einer Liste in einen
String, wenn externe Befehle gestartet werden.
(Wichtig! Die Umgebungs-Konvertierung string -> value findet statt nachdem env.rsh und config.rsh ausgewertet wurden. Alle Umgebungsvariablen in env.rsh und config.rsh sind immer noch Strings solange sie nicht manuell auf andere Werte gesetzt wurden.)
Entfernen von Umgebungsvariablen
Umgebungsvariablen können im aktuellen Gültigkeitsbereich
entfernt werden via
hide
:
> $env.FOO = 'BAR'
...
> hide FOO
Dieses Verstecken im Gültigkeitsbereich erlaubt es gleichzeitig temporär eine Variabel zu entfernen ohne dass man die höher gelegene Umgebung modifiziert wird:
> $env.FOO = 'BAR'
> do {
hide FOO
# $env.FOO does not exist
}
> $env.FOO
BAR
Mehr Informationen über Verstecken findet sich im Kapitel Modules