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

Kürzlich habe ich festgestellt, 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 eine der anderen vorziehen? Bitte schlagen Sie Richtlinien vor.

Was die Shell-Kompatibilität betrifft, welche ist die umfangreichste (deckt mehr Shell-Dialekte ab)?

Ich habe diese antworte , aber ich möchte die Frage mit env und Richtlinien für Verwendungspräferenzen erweitern.

Antwort

export VARIABLE_NAME="some value" ist die Möglichkeit, eine Umgebungsvariable in einer POSIX-kompatiblen Shell festzulegen (sh, dash, bash, ksh usw.; auch zsh). Wenn die Variable bereits einen Wert hat, können Sie export VARIABLE_NAME verwenden, um sie zu einer Umgebungsvariablen zu machen, ohne ihren Wert zu ändern.

Pre-POSIX Bourne-Shells haben dies nicht unterstützt, weshalb Sie Skripte sehen, die export VARIABLE_NAME="some value" vermeiden und VARIABLE_NAME="some value"; export VARIABLE_NAME stattdessen. Aber Pre-POSIX Bourne-Shells sind heutzutage äußerst selten.

setenv VARIABLE_NAME="some value" ist die csh-Syntax zum Festlegen einer Umgebungsvariablen. setenv existiert 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 Befehl env ist nur in shebang-Zeilen sehr selten nützlich. Wenn es ohne Argumente aufgerufen wird, wird die Umgebung angezeigt, aber export macht es besser (sortiert und oft in Disambigua zitiert) te Zeilenumbrüche in Werten von Zeilenumbrüchen, die Werte trennen). Beim Aufrufen mit Argumenten wird ein Befehl mit zusätzlichen Umgebungsvariablen ausgeführt, aber derselbe Befehl ohne env funktioniert auch (VAR=value mycommand führt mycommand mit VAR auf value gesetzt, genau wie env VAR=value mycommand). Der Grund, warum env in der Shebang-Zeile nützlich ist, besteht darin, dass die PATH Suche durchgeführt wird und beim Aufrufen mit einem Befehl nichts anderes ausgeführt wird Name. Der Befehl env kann nützlich sein, um einen Befehl mit nur wenigen Umgebungsvariablen mit -i oder ohne Parameter zum Anzeigen der Umgebung einschließlich Variablen auszuführen mit ungültigen Namen, die die Shell nicht importiert.

Antwort

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

export ist dagegen eine integrierte Bash, die die Umgebung ändert und die exportierte Variable für untergeordnete Prozesse sichtbar macht, die in der aktuellen Sitzung erzeugt wurden Dies kann durch Ausführen von VAR="asdf" %program_name% erreicht werden.

env ist kein integriertes Programm, sondern ein Programm für sich Die Oberfläche funktioniert genau so, wenn Sie VAR="asdf" %program_name%, aber auf der unteren Ebene werden die Dinge etwas komplizierter. Zuerst wird die env gestartet. 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.

setenv ist nur export in Shells der csh-Familie, wie in Ihrer Antwort angegeben.

Kommentare

  • In modernen Shells aktualisiert VAR=asdf die Umgebung, wenn VAR bereits in der Umgebung war. (Dies war in der ursprünglichen Bourne-Shell nicht ' nicht wahr.)

Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.