2017-02-16 2 views
0

die neueste Ubuntu Standard-Shell verwenden (bash-kompatibel) Ich kann eine einzeilige Funktion erstellen und nennen es:Linux-Shell nicht eine Funktion über Dollar-Operator aufrufen

$ foo() { echo bar; }; foo 
bar 

Aber wenn ich eine Zeichenfolge mit der gleiche Befehl und führen Sie es über $, Funktion wird nicht aufgerufen. Welchen Teil der Shell-Funktion Syntax verstehe ich nicht?

$ FOO='foo() { echo bar; }; foo' 
$ echo $FOO 
foo() { echo bar; }; foo 
$ $FOO 
-bash: foo(): command not found 
+0

suchen Sie wahrscheinlich nach 'eval'. – fedorqui

+0

Bitte überprüfen Sie dies [Frage SO] (https://stackoverflow.com/questions/11198622/store-a-funktion-in-a-unix-variable) – doz10us

Antwort

5

Parameter speichern Daten, nicht Code. Sie haben keine Funktion definiert; Sie haben gerade eine Zeichenfolge erstellt, die wie eine Funktionsdefinition und ein Aufruf aussieht.

Man könnte es mit etwas verwirrend sein, wie

$ FOO="echo bar" 
$ $FOO 
bar 

, die einen Befehlsnamen und seinem Argument enthält. Wenn $FOO erweitert wird, wird der resultierende Wortstrom dann untersucht, um zu identifizieren, welches Wort in der Befehlsposition ist und welche Wörter Argumente sind. Eine Funktionsdefinition ist jedoch kein Befehl. Es ist eine spezielle Syntax, die nicht der normalen Auswertungsstrategie einer Befehlszeile unterliegt.

Ihr Beispiel ist nicht ein einziger Befehl: Es ist ein Befehl Liste, die durch ; getrennt ein oder mehrere Befehle sind, &, && oder ||.

Schließlich $ führt nichts aus; es beginnt einfach eine Parametererweiterung. Ob das Ergebnis der Erweiterung ausgeführt wird, hängt vom Kontext ab, in dem die Erweiterung stattfindet.

+0

Vielen Dank! Das heißt, dass die Funktionsdefinition eine "spezielle Syntax" ist, die bei "normaler Auswertung" und "Auswertung nach Parametererweiterung" anders funktioniert? Ist es irgendwo geschrieben, oder nur eine Implementierungsdetails? – grigoryvp

+0

Beginnen Sie mit der Manpage "SIMPLE COMMAND EXPANSION". – chepner

+0

Verstanden, ';' und "&" spielt nicht gut zusammen. 'FOO = 'Echo a; Echo b '; $ FOO' wird "a; echo b" wiedergeben. Danke vielmals! – grigoryvp

Verwandte Themen