Unix-Shells führen eine Reihe von Transformationen auf jeder Eingabezeile aus, bevor sie ausgeführt werden. Für die meisten Schalen sieht es so etwas wie dieses (vom bash
manpage genommen):
- anfängliche Wort Spaltung
- Klammer Expansion
- Tilde-Erweiterung
- Parameter, variable und arithmetische Erweiterung
- Befehl Ersatz
- sekundäre Wortaufteilung
- Pfad e xpansion (aka Globbing)
- Zitat Entfernung
Mit $cmd
direkt durch Ihren Befehl während der Parameter Expansionsphase ersetzt wird, und es durchläuft dann alle folgenden Transformationen.
Mit eval "$cmd"
tut nichts, bis der Zitat Entfernungsphase, wo $cmd
wie zurückgegeben wird und als Parameter an eval
übergeben, deren Funktion es ist wieder die gesamte Kette laufen vor der Ausführung.
Sie sind also in den meisten Fällen identisch und unterscheiden sich, wenn Ihr Befehl die Umwandlungsschritte bis zur Parametererweiterung verwendet. Beispiel: Verwenden der Klammererweiterung:
$ cmd="echo foo{bar,baz}"
$ $cmd
foo{bar,baz}
$ eval "$cmd"
foobar foobaz
Siehe [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –