it-swarm.com.de

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 eins dem anderen vorziehen? Bitte schlagen Sie Richtlinien vor.

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

Ich habe dies bereits bemerkt Antwort , aber ich möchte die Frage mit env und Richtlinien für Nutzungspräferenzen erweitern.

19
Maroshi

Mit export VARIABLE_NAME='some value' Können Sie eine Umgebungsvariable in einer POSIX-kompatiblen Shell festlegen (sh, dash, bash, ksh usw. .; auch zsh). Wenn die Variable bereits einen Wert hat, können Sie sie mit export VARIABLE_NAME Zu einer Umgebungsvariablen machen, ohne ihren Wert zu ändern.

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

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

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 zitiert, um Zeilenumbrüche in Werten von Zeilenumbrüchen zu unterscheiden, die Werte trennen). Wenn es mit Argumenten aufgerufen wird, wird ein Befehl mit zusätzlichen Umgebungsvariablen ausgeführt, aber der gleiche Befehl ohne env funktioniert auch (VAR=value mycommand Führt mycommand mit VAR aus value, genau wie env VAR=value mycommand). Der Grund, warum env in der Shebang-Zeile nützlich ist, besteht darin, dass PATH Lookup ausgeführt wird und beim Aufrufen mit einem Befehlsnamen nichts anderes ausgeführt wird. Der Befehl env kann nützlich sein, um einen Befehl mit nur wenigen Umgebungsvariablen mit -i Oder ohne Parameter auszuführen, um die Umgebung anzuzeigen, einschließlich Variablen mit ungültigen Namen, die die Shell nicht importiert.

Wenn Sie eine Variable wie VAR='asdf' Festlegen, bleibt die Umgebung unverändert. Dies 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 hingegen ist eine integrierte Bash, die die Umgebung ändert und die exportierte Variable für untergeordnete Prozesse sichtbar macht, die in der aktuellen Sitzung erzeugt wurden. Sie können dasselbe erreichen, indem Sie VAR='asdf' %program_name% Ausführen.

env ist kein eingebautes Programm, sondern ein Programm für sich. An der Oberfläche funktioniert es genau wie bei VAR='asdf' %program_name%, Aber auf der unteren Ebene werden die Dinge etwas komplizierter. Zuerst wird das 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 mit exec (3) Systemaufruf erreichen.

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

3
user230253
2
Kusalananda