Ab und zu starte ich ein Bash-Skript, und es gibt einige Möglichkeiten, eine Variable zu setzen:
key=value
env key=value
export key=value
Wenn Sie sich in einem Skript oder einem einzelnen Befehl befinden (zum Beispiel werde ich häufig eine Variable mit einem Wine-Launcher verketten, um das richtige Wine-Präfix festzulegen), sind diese offenbar vollständig austauschbar, aber das kann sicherlich nicht der Fall sein.
Was ist der Unterschied zwischen diesen drei Methoden und können Sie mir ein Beispiel geben, wann ich jede einzelne speziell verwenden möchte?
Definitiv verwandt mit Was ist der Unterschied zwischen "VAR = ..." und "export VAR = ..."? aber ich möchte wissen, wie das auch dazu env
passt, und einige Beispiele, die die Vorteile von jedem zeigen, wären auch schön :)
command-line
bash
Oli
quelle
quelle
export key=value
eine erweiterte Syntax ist und nicht in portablen Skripten verwendet werden sollte#! /bin/sh
.Antworten:
Betrachten wir ein konkretes Beispiel. Der
grep
Befehl verwendet eine Umgebungsvariable, die aufgerufen wirdGREP_OPTIONS
, um Standardoptionen festzulegen.Jetzt. Vorausgesetzt, die Datei
test.txt
enthält die folgenden Zeilen:Ausführen des Befehls
grep one test.txt
wird zurückkehrenWenn Sie grep mit der
-v
Option ausführen , werden die nicht übereinstimmenden Zeilen zurückgegeben, sodass die Ausgabe erfolgtWir 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.Das Ergebnis:
Offensichtlich wurde die Option
-v
nicht übernommengrep
.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
welches das erwartete zurückbringt
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:
kehrt jetzt zurück
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. Wennenv
aufgerufen wird, passieren folgende Dinge:env
wird als neuer Prozess ausgeführtenv
ändert die Umgebung undenv
Prozess wird durch dencommand
Prozess ersetzt.Beispiel:
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ührenSie 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 dessystem()
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 verwendetenexecvp()
Funktion , die durch den suchtPATH
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:
Anstatt Calibre zu starten, führt dies zu
quelle
env
? Ich meine, wenn Sie eine neue Shell öffnen, haben Sie immer ein paar Variablen. Einige Programme müssen diese alsoexport
bearbeitet haben , oder?set var=blah
?