it-swarm.com.de

Umgebungsvariable für einen Programmaufruf in bash mit env festlegen

Ich versuche, einen Shell-Befehl mit einer geänderten Umgebung über den Befehl env aufzurufen.

Nach dem Handbuch

env HELLO='Hello World' echo $HELLO

sollte Hello World echo, aber nicht ..__

HELLO='Hello World' bash -c 'echo $HELLO'

es gibt Hello World wie erwartet aus (dank dieser Antwort für diese Info).

Was fehlt mir hier?

Prost, Niklas

25
Niklas

Dies liegt daran, dass Ihre aktuelle Shell in Ihrem ersten Fall die $ HELLO-Variable erweitert, bevor Sie die Befehle ausführen. Und in Ihrer aktuellen Shell gibt es keine HELLO-Variablen.

env HELLO='Hello World' echo $HELLO

werde das tun:

  • alle angegebenen Variablen erweitern, in diesem Fall $ HELLO
  • führe env mit den 3 Argumenten 'HELLO = Hello World', 'echo' und '' (leere Zeichenfolge, da in der aktuellen Shell keine HELLO-Variable gesetzt ist).
  • Der Befehl env wird ausgeführt und setzt in seiner Umgebung HELLO = 'Hello World'
  • env führt ein Echo mit dem Argument '' aus (eine leere Zeichenfolge)

Wie Sie sehen, hat die aktuelle Shell die $ HELLO-Variable erweitert, die nicht gesetzt ist.

HELLO='Hello World' bash -c 'echo $HELLO'

werde das tun:

  • stellen Sie die Variable HELLO='Hello World für den folgenden Befehl ein
  • bash mit den 2 Argumenten '-c' und 'echo $ HELLO' ausführen
  • da das letzte Argument in einfache Anführungszeichen eingeschlossen ist, wird alles darin nicht erweitert
  • die neue Bash führt wiederum den Befehl echo $HELLO aus.
  • Um echo $ HELLO in der neuen Bash-Sub-Shell auszuführen, erweitert bash zunächst alles, was möglich ist, $ HELLO in diesem Fall, und die übergeordnete Shell hat dies auf "Hello World" festgelegt.
  • Die Subshell führt das Echo "Hello World" aus.

Wenn Sie versucht haben, z. diese:

env HELLO='Hello World' echo '$HELLO'

  • Die aktuelle Shell würde alles erweitern, was sie kann, was nichts ist, da $ HELLO in einfache Anführungszeichen gesetzt wird
  • starte env mit den 3 Argumenten 'HELLO = Hello World', 'echo' und '$ HELLO'
  • Der Befehl env wird ausgeführt und setzt in seiner Umgebung HELLO = 'Hello World'
  • env führt ein Echo mit dem Argument '$ HELLO' aus.

In diesem Fall gibt es keine Shell, die $ HELLO erweitern wird. Das Echo erhält also die Zeichenfolge $HELLO und gibt diese aus. Die variable Erweiterung wird nur durch Schalen vorgenommen.

43
nos

Ich denke, was passiert, ist ähnlich wie diese Situation , in der ich auch verwirrt war.

Kurz gesagt, die variable Erweiterung wird im ersten Fall von der aktuellen Shell vorgenommen, die $HELLO nicht in ihrer Umgebung hat. Im zweiten Fall verhindern jedoch einfache Anführungszeichen, dass die aktuelle Shell die Variablenerweiterung ausführt, sodass alles wie erwartet funktioniert.

Beachten Sie, wie durch das Ändern von Anführungszeichen in doppelte Anführungszeichen dieser Befehl nicht wie gewünscht funktioniert:

HELLO='Hello World' bash -c "echo $HELLO"

Nun wird dies aus demselben Grund wie der erste Befehl in Ihrer Frage fehlschlagen.

4
Lev Levitsky

Das funktioniert und ist gut für mich

$ MY_VAR='Hello' ANOTHER_VAR='World!!!' && echo "$MY_VAR $ANOTHER_VAR"
Hello World!!!
1
deFreitas

So können Sie leichter feststellen, dass Shell wie erwartet funktioniert.

env A=42 env
env

Der erste Befehl führt A auf 42 und env aus. Der zweite Befehl führt auch env aus. Vergleichen Sie die Ausgabe von beiden.

0