2016-08-03 35 views
2

Die Standard-POSIX-Shell beikann Befehlsersetzung in einer POSIX-Shell nur an Stelle eines Befehlsnamens verwendet werden?

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04

sagt in Abschnitt 2.6.3:

Command substitution allows the output of a command to be substituted in place of the command name itself 

Dies scheint zu bedeuten, dass es nur arbeiten, gewährleistet ist, wenn Sie für den gesamten Befehl ersetzen Name; Wenn Sie einen Teil davon oder etwas anderes ersetzen, kann es funktionieren oder auch nicht.

Experimenting:

$ echo ; 

$ $(echo echo) ; 

$ 

So weit so gut ...

$ e$(echo cho) ; 

$ echo $(echo ';') 
; 
$ echo $(echo foobar) 
foobar 

Das erste und das dritte Beispiel oben zu "arbeiten" erscheinen, aber die zweite "nicht funktioniert". Ist dies alles einfach undokumentiertes und zufälliges Verhalten, wie der Standard zu implizieren scheint, und in Wirklichkeit für irgendeine andere POSIX-Shell, ist keines dieser drei garantiert "zu arbeiten"?

(Mit „Arbeit“, meine ich „das gleiche Ergebnis produzieren, als ob die Ergebnisse der Substitution in der sich auf dem Terminal-Befehl eingegeben wurden“)

+0

Im zweiten und dritten Beispiel ist der Befehl "echo" und das ist _nicht_ das Ergebnis der Befehlsersetzung. Nur die Argumente für den Befehl echo sind das Ergebnis der Befehlsersetzung. Hast du das beabsichtigt? – John1024

+0

Ja; und nach dem Standard funktioniert das nicht garantiert, oder? Mit "Arbeit", ich meine, erzeuge das gleiche Ergebnis, als wäre das Ergebnis der Substitution einfach in den Befehl selbst eingegeben worden. –

+0

Haben Sie vor $ '(echo foobar)' anstelle von 'echo $ (echo foobar)' zu schreiben? – John1024

Antwort

0

Der Grund, warum dies:

$ echo $(echo ';') 

wird nicht ausgegeben gleich wie folgt aus:

$ echo ; 

ist der gleiche Grund, warum dies:

$ ; 
bash: syntax error near unexpected token `;' 

Does Ausgang nicht das gleiche wie folgt aus:

$ `echo ';'` 
;: command not found 

Die neueste Fall die Ausgabe von Kommandosubstitution (die() erwartet werden() Token ;?) Als interpretiert Befehl, weil er als Befehl in einer Subshell übergeben und interpretiert wird und nicht als integrierter Befehls-Interpreter.

Als meine Interpretation ist dies nicht gegen den Standard.

EDIT: Die Beantwortung der Frage

Sie erklärte:

Dies scheint zu bedeuten, dass es nur garantiert ist zu arbeiten, wenn Sie Ersatz für den ganze Befehlsnamen ; Wenn Sie einen Teil von es oder etwas anderes ersetzen, dann kann es oder möglicherweise nicht funktionieren.

Und der POSIX-Norm Zustände:

Die Schale wird die Befehlssubstitutions durch Befehl ausführt in einer Subshell-Umgebung erweitern (siehe Umwelt Shell Execution) und den Befehl Substitution ersetzt (der Befehlstext plus die umschließenden "$()" oder "backquotes) mit der Standardausgabe des Befehls, die Folgen von einem entfernen oder mehr <newline> Zeichen am Ende der Substitution.

Der Standard scheint klar zu sein, was passiert. Dies ist keine Frage dessen, was in einem Befehl vorhanden ist, der eine Befehlsersetzung enthält, sondern nur den Befehl, der sich innerhalb der umschließenden $() oder oder `` befindet.

+0

danke, aber IMHO hast du meine Frage nicht beantwortet, aber eine andere –

+0

@MarkGaleck Editierte mit dem relevanten Teil des Standards in Bezug auf die Unterscheidung von was auf was es bezieht sich auf (was nicht außerhalb der '$()' aber zu was drinnen ist). – pah