Was ist der Unterschied zwischen env, setenv, export und wann?

16

Kürzlich ist mir aufgefallen, dass wir drei Optionen zum Festlegen von Umgebungsvariablen haben:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Wenn es andere Möglichkeiten gibt, klären Sie uns bitte auf.

Wann sollte ich eins dem anderen vorziehen? Bitte schlagen Sie Richtlinien vor.

Welche Shell-Kompatibilität ist am umfangreichsten (deckt mehr Shell-Dialekte ab)?

Diese Antwort ist mir bereits aufgefallen , aber ich möchte die Frage mit den envRichtlinien für Benutzungspräferenzen erweitern.

Maroshi
quelle

Antworten:

12

export VARIABLE_NAME='some value'ist die Art und Weise eine Umgebungsvariable in jeder POSIX-kompatibelen Schale einzustellen ( sh, dash, bash, ksh, etc .; zsh auch). Wenn die Variable bereits einen Wert hat, können Sie export VARIABLE_NAMEsie zu einer Umgebungsvariablen machen, ohne ihren Wert zu ändern.

In Bourne-Shells vor POSIX wurde dies nicht unterstützt. Daher werden Skripts angezeigt, die vermieden export VARIABLE_NAME='some value'und VARIABLE_NAME='some value'; export VARIABLE_NAMEstattdessen verwendet werden. Aber Pre-POSIX-Bourne-Shells sind heutzutage äußerst selten.

setenv VARIABLE_NAME='some value'ist die csh-Syntax zum Festlegen einer Umgebungsvariablen. Anders als in sh setenv VARIABLE_NAME. setenvgibt es in sh nicht und csh wird in Skripten äußerst selten verwendet und wurde in den letzten 20 Jahren von bash für die interaktive Verwendung übertroffen (und zsh noch länger), sodass Sie es vergessen können, es sei denn, Sie stoßen darauf.

Der envBefehl ist sehr selten nützlich, außer in Shebang-Zeilen . Wenn es ohne Argumente aufgerufen wird, zeigt es die Umgebung an, exportmacht es aber besser (sortiert und oft in Anführungszeichen gesetzt, um Zeilenumbrüche von Zeilenumbrüchen zu trennen, die Werte trennen). Wenn es mit Argumenten aufgerufen wird, führt es einen Befehl mit zusätzlichen Umgebungsvariablen aus, aber ohne denselben Befehl envfunktioniert auch ( VAR=value mycommandläuft mycommandmit VARset to value, genau wie env VAR=value mycommand) env.Der Grund für die Verwendung von shebang ist, dass es eine PATHSuche durchführt und beim Aufrufen mit einem Befehlsnamen nichts anderes tut. Der envBefehl kann nützlich sein, um einen Befehl mit auszuführen nur ein paar Umgebungsvariablen mit-ioder ohne Parameter zum Anzeigen der Umgebung, einschließlich Variablen mit ungültigen Namen, die von der Shell nicht importiert werden.

Gilles 'SO - hör auf böse zu sein'
quelle
2

Das Festlegen einer Variablen wie VAR='asdf'lässt die Umgebung unverändert, was bedeutet, dass die Programme, die Sie in derselben Sitzung starten, nichts darüber wissen VARund nicht darauf zugreifen können. Sie möchten dieses Verhalten beim Schreiben von Shell-Skripten.

exportAuf der anderen Seite handelt es sich um eine integrierte Bash, die die Umgebung ändert und die exportierte Variable für untergeordnete Prozesse sichtbar macht, die in der aktuellen Sitzung erstellt wurden. Sie können das gleiche erreichen, indem Sie laufen VAR='asdf' %program_name%.

envist kein eingebautes, sondern ein Programm für sich. An der Oberfläche funktioniert es genauso wie bei Ihnen VAR='asdf' %program_name%, aber auf der unteren Ebene wird es etwas komplizierter. Zuerst wird der envgestartet. Es ändert die Umgebung und führt dann den Befehl mit den angegebenen Argumenten aus. Das gleiche Verhalten können Sie in Ihrem eigenen Code erreichen, indem Sie den Systemaufruf exec (3) verwenden.

setenvist nur exportin csh-Familien-Shells, wie in Ihrer Antwort angegeben.

user230253
quelle
1
VAR=asdfAktualisiert in modernen Shells die Umgebung, wenn sie VARsich bereits in der Umgebung befunden hat. (Dies war in der ursprünglichen Bourne-Shell nicht der Fall.)
Gilles 'SO - hör auf, böse zu sein',