Befehlssubstitution

Im Computer, Befehlssubstitution ist eine Einrichtung, die a erlaubt Befehl ausgeführt werden und seine Ausgabe als Argumente an einen anderen Befehl wieder in die Befehlszeile eingefügt werden. Befehlssubstitution erschien zuerst in der Bourne Shell,[1] eingeführt mit Version 7 Unix 1979 und ist ein Merkmal aller später geblieben Unix -Muscheln. Das Feature wurde seitdem in anderen übernommen Programmiersprachen auch einschließlich Perl, Php, Rubin und Microsoft Power Shell unter Fenster. Es erscheint auch in Microsoft's Cmd.exe in dem ZUM Befehl und die () Befehl.

Syntax und Semantik

Shells implementieren normalerweise die Befehlsubstitution durch Erstellen von a Kinderprozess den ersten Befehl mit seinem ausführen Standardausgabe leitete Zurück zur Shell, die diese Ausgabe liest, Parsing es in Wörter getrennt durch Whitespace. Da die Hülle nicht wissen kann, dass das Kind über die gesamte Ausgabe des Kindes verfügt, bis das Rohr schließt oder das Kind stirbt, wartet es bis dahin, bevor ein weiterer Kinderprozess beginnt, um den zweiten Befehl auszuführen.

Dies C Shell Beispiel zeigt, wie man nach allen suchen könnte C Dateien mit der Saite Malloc Verwendung FGREP und bearbeiten Sie dann alle, die mit dem gefunden werden vi Editor. Die hier gezeigte syntaktische Notation, `...`, verwenden Rückquoten wie Grenzwerte, ist der ursprüngliche Stil und wird von allen gemeinsamen Unix -Shells unterstützt.

#!/bin/csh vi `fGrep -l malloc *.c` 

Einwände wurden beides erhoben Syntax, wie es tippt und die Semantik, wie es funktioniert.

Obwohl es leicht zu tippen ist, ein wichtiger Faktor für einen interaktiven Befehlsprozessor, wurde die Syntax als unangenehm für das Nest kritisiert und einen Befehlssubstitution in einen anderen eingebaut, da sowohl die linken als auch die rechten Abgrenzer gleich sind.[2] Das Kornshell (KSH)[3] löste dies mit einer alternativen Notation, $ (...), Kreditaufnahme aus dem notationalen Stil, der für verwendet wird variable Substitution. Heute unterstützen die meisten Unix -Shells diese Syntax. Microsoft's Power Shell Verwendet diese Notation auch mit der gleichen Semantik.

#!/bin/bash vi $ (fGrep -l malloc *.c) 

Die Semantik, die die Ausgabe in Wörter bei Whitespace unterbricht, wurde ebenfalls kritisiert. Es hat früh gut funktioniert Unix Systeme, in denen Dateinamen nie Räume enthielten, aber es funktioniert bei Modern überhaupt nicht gut Fenster und Linux Systeme, in denen Dateinamen sicherlich Räume enthalten können.[4] In einem dieser früheren Beispiele, wenn eines der Dateinamen mit dem übereinstimmten *.c Wildcard enthält einen Raum, diesen Dateinamen wird in zwei getrennte Argumente unterteilt viOffensichtlich nicht das, was beabsichtigt war. Hamilton C Shell löste dies mit einer doppelten Backquote -Notation, ``...``, das analysiert nur bei Linienbrüche.[5]

Dies ist ein Beispiel für die Befehlssubstitution mit der () Bediener in Power Shell:

$ Myvariable = (ls) Echo $ Myvariable 

Ausdrucksubstitution

Eine verwandte Einrichtung, Expressionssubstitution, findet sich in den Sprachen Common Lisp und Planen, aufgerufen durch die Verwendung des Comma-AT-Operator ABCdurch Verwendung eines Ausdrucks, der zwischen den Rückquoten innerhalb einer Textanzeige eingeschlossen ist (Saitenliteral). Zum Beispiel den ABC -Befehl Schreiben Sie '2 + 2 = `2 + 2`' ' erzeugt die Ausgabe 2 + 2 = 4.

Siehe auch

Verweise

  1. ^ Dahdah, Howard. "Der A-Z der Programmiersprachen: Bourne Shell oder SH, ein ausführliches Interview mit Steve Bourne, Schöpfer der Bourne Shell, oder SH", Computerwelt, 5. März 2009.
  2. ^ UNIX -Elektrowerkzeuge: 45.31 verschachtelte Befehlssubstitution.
  3. ^ Rosenblatt, Bill; Arnold Robbins (2002). Lernen der Korn -Hülle (2 ed.). O'Reilly Media, Inc. p. 127. ISBN 978-0-596-00195-7. Abgerufen 2010-07-20. Die Syntax der Befehlssubstitution ist:$ (UNIX -Befehl)Der Befehl in der Klammern wird ausgeführt, und alles, was der Befehl in die Standardausgabe (und an Standardfehler) schreibt, wird als Wert des Ausdrucks zurückgegeben.
  4. ^ Johnson, Chris (2009), "8", Pro -Bash -Programmierung: Scripting der Linux -Shell, New York, NY: Springer-Verlag New York, Inc., p. 84, abgerufen 19. Dezember, 2014, Dateinamen, die Leerzeichen enthalten, sind ein Gräuel, aber sie sind heutzutage so häufig, dass Skripte ihre Möglichkeit (oder sollte ich Unvermeidlichkeit sagen?) Berücksichtigt müssen. ... Das Ergebnis der Befehlssubstitution unterliegt der Wortaufteilung
  5. ^ Hamilton C Shell -Benutzerhandbuch: E/A -Umleitung: Befehlssubstitution, Hamilton Laboratories, archiviert aus das Original am 19. Dezember 2014, abgerufen 19. Dezember, 2014