Betrachten wir ein konkretes Beispiel. Der grep
Befehl verwendet eine Umgebungsvariable, die aufgerufen wird GREP_OPTIONS
, um Standardoptionen festzulegen.
Jetzt. Vorausgesetzt, die Datei test.txt
enthält die folgenden Zeilen:
line one
line two
Ausführen des Befehls grep one test.txt
wird zurückkehren
line one
Wenn Sie grep mit der -v
Option ausführen , werden die nicht übereinstimmenden Zeilen zurückgegeben, sodass die Ausgabe erfolgt
line two
Wir werden nun versuchen, die Option mit einer Umgebungsvariablen zu setzen.
Umgebungsvariablen, die ohne festgelegt wurden, export
werden nicht in die Umgebung der von Ihnen aufgerufenen Befehle übernommen.
GREP_OPTIONS='-v'
grep one test.txt
Das Ergebnis:
line one
Offensichtlich wurde die Option -v
nicht übernommen grep
.
Sie möchten dieses Formular verwenden, wenn Sie eine Variable nur für die Shell festlegen, die Sie beispielsweise for i in * ; do
nicht exportieren möchten $i
.
Die Variable wird jedoch an die Umgebung dieser bestimmten Befehlszeile übergeben, sodass Sie dies tun können
GREP_OPTIONS='-v' grep one test.txt
welches das erwartete zurückbringt
line two
Sie verwenden dieses Formular, um die Umgebung dieser bestimmten Instanz des gestarteten Programms vorübergehend zu ändern.
Durch das Exportieren einer Variablen wird die Variable vererbt:
export GREP_OPTIONS='-v'
grep one test.txt
kehrt jetzt zurück
line two
Dies ist die gebräuchlichste Methode, um Variablen für die Verwendung später gestarteter Prozesse in einer Shell festzulegen
Dies wurde alles in Bash gemacht. export
ist ein bash builtin; VAR=whatever
ist Bash-Syntax. env
Andererseits ist es ein Programm für sich. Wenn env
aufgerufen wird, passieren folgende Dinge:
- Der Befehl
env
wird als neuer Prozess ausgeführt
env
ändert die Umgebung und
- Ruft den Befehl auf, der als Argument angegeben wurde. Der
env
Prozess wird durch den command
Prozess ersetzt.
Beispiel:
env GREP_OPTIONS='-v' grep one test.txt
Dieser Befehl startet zwei neue Prozesse: (i) env und (ii) grep (tatsächlich ersetzt der zweite Prozess den ersten). Aus Sicht des grep
Prozesses ist das Ergebnis genau das gleiche wie beim Ausführen
GREP_OPTIONS='-v' grep one test.txt
Sie können dieses Idiom jedoch verwenden, wenn Sie sich außerhalb von bash befinden oder keine andere Shell starten möchten (z. B. wenn Sie die exec()
Funktionsfamilie anstelle des system()
Aufrufs verwenden).
Zusätzlicher Hinweis auf #!/usr/bin/env
Dies ist auch der Grund, warum das Idiom nicht #!/usr/bin/env interpreter
verwendet wird #!/usr/bin/interpreter
. env
keinen vollständigen Pfad zu einem Programm benötigen, weil es die verwendeten execvp()
Funktion , die durch den sucht PATH
Variable gerade wie ein Shell tut, und dann ersetzt sich durch den Befehl ausführen. Auf diese Weise kann herausgefunden werden, wo ein Interpreter (wie Perl oder Python) auf dem Pfad "sitzt".
Dies bedeutet auch, dass Sie durch Ändern des aktuellen Pfads beeinflussen können, welche Python-Variante aufgerufen wird. Dies ermöglicht Folgendes:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
Anstatt Calibre zu starten, führt dies zu
I am an evil interpreter!
export key=value
eine erweiterte Syntax ist und nicht in portablen Skripten verwendet werden sollte#! /bin/sh
.