Der wichtigste Unterschied zwischen
bash -c "$1"
Und
eval "$1"
Ist das erstere läuft in einer Unterschale und das letztere nicht. Damit:
set -- 'var=something'
bash -c "$1"
echo "$var"
AUSGABE:
#there doesn't seem to be anything here
set -- 'var=something'
eval "$1"
echo "$var"
AUSGABE:
something
Ich habe jedoch keine Ahnung, warum jemand die ausführbare Datei jemals bash
auf diese Weise verwenden würde. Wenn Sie es aufrufen müssen, verwenden Sie die POSIX-Garantie sh
. Oder (subshell eval)
wenn Sie Ihre Umwelt schützen möchten.
Ich persönlich bevorzuge .dot
vor allem die Muschel .
printf 'var=something%d ; echo "$var"\n' `seq 1 5` | . /dev/fd/0
AUSGABE
something1
something2
something3
something4
something5
ABER BRAUCHEN SIE ES?
Die einzige Ursache für die Verwendung besteht in dem Fall, dass Ihre Variable tatsächlich eine andere Variable zuweist oder auswertet, oder dass die Wortteilung für die Ausgabe wichtig ist.
Zum Beispiel:
var='echo this is var' ; $var
AUSGABE:
this is var
Das funktioniert, aber nur, weil echo
die Anzahl der Argumente keine Rolle spielt.
var='echo "this is var"' ; $var
AUSGABE:
"this is var"
Sehen? Die doppelten Anführungszeichen kommen daher, dass das Ergebnis der Erweiterung der Shell $var
nicht ausgewertet wird quote-removal
.
var='printf %s\\n "this is var"' ; $var
AUSGABE:
"this
is
var"
Aber mit eval
oder sh
:
var='echo "this is var"' ; eval "$var" ; sh -c "$var"
AUSGABE:
this is var
this is var
Wenn wir eval
oder sh
die Shell verwenden, werden die Ergebnisse der Erweiterungen in einem zweiten Durchgang überprüft und auch als potenzieller Befehl ausgewertet, sodass die Anführungszeichen einen Unterschied ausmachen. Sie können auch tun:
. <<VAR /dev/fd/0
${var:=echo "this is var"}
#END
VAR
AUSGABE
this is var
e='echo foo'; $e
funktioniert gut