En informática , la sustitución de comandos es una función que permite ejecutar un comando y pegar su salida en la línea de comandos como argumentos de otro comando. La sustitución de comandos apareció por primera vez en el shell de Bourne , [1] introducido con la versión 7 de Unix en 1979, y ha permanecido como una característica de todos los shells de Unix posteriores . Desde entonces, la función también se ha adoptado en otros lenguajes de programación , incluidos Perl , PHP , Ruby y Powershell de Microsoft en Windows . También aparece en MicrosoftCMD.EXE en el FOR
comando y el ( )
comando.
Sintaxis y semántica
Los shells generalmente implementan la sustitución de comandos creando un proceso hijo para ejecutar el primer comando con su salida estándar canalizada de nuevo al shell, que lee esa salida, analizándola en palabras separadas por espacios en blanco . Debido a que el shell no puede saber que tiene toda la salida del niño hasta que la tubería se cierra o el niño muere, espera hasta entonces antes de iniciar otro proceso secundario para ejecutar el segundo comando.
Este ejemplo de shell C muestra cómo se pueden buscar todos los archivos C que contienen la cadena malloc
usando fgrep
y luego editar los que se encuentran usando el vi
editor. La notación sintáctica que se muestra aquí, `
... `
, usando comillas inversas como delimitadores , es el estilo original y es compatible con todos los shells comunes de Unix.
#! / bin / csh
vi ` fgrep -l * .c malloc `
Se han planteado objeciones tanto a la sintaxis , cómo se escribe, como a la semántica , cómo funciona.
Si bien es fácil de escribir, un factor importante para un procesador de comandos interactivo, la sintaxis ha sido criticada como incómoda de anidar, colocando una sustitución de comando dentro de otra, porque los delimitadores izquierdo y derecho son los mismos. [2] El KornShell (ksh) [3] resolvió esto con una notación alternativa, $(
... )
, tomando prestado del estilo de notación utilizado para la sustitución de variables . Hoy en día, la mayoría de shells de UNIX admiten esta sintaxis. PowerShell de Microsoft también usa esta notación, con la misma semántica.
#! / bin / bash
vi $ ( fgrep -l malloc * .c )
La semántica, que divide la salida en palabras en espacios en blanco, también ha sido criticada. Funcionó bien en los primeros sistemas Unix donde los nombres de archivo nunca contenían espacios, pero no funciona del todo bien en los sistemas modernos de Windows y Linux donde los nombres de archivo ciertamente pueden contener espacios. [4] En cualquiera de estos ejemplos anteriores, si alguno de los nombres de archivo que coinciden con el *.c
comodín contiene un espacio, ese nombre de archivo se dividirá en dos argumentos separados para vi
, claramente, no lo que se pretendía. El shell de Hamilton C resolvió esto con una notación de comillas inversas dobles, ``
... ``
, que se analiza en palabras solo en los saltos de línea. [5]
Este es un ejemplo de sustitución de comandos con el ()
operador en PowerShell :
$ MyVariable = ( ls ) echo $ MyVariable
Sustitución de expresiones
Una función relacionada, la sustitución de expresiones, se encuentra en los lenguajes Common Lisp y Scheme , que se invoca mediante el operador coma-en una expresión marcada con el operador de comillas inversas (o "cuasiquote"), y en ABC , utilizando una expresión encerrada entre comillas inversas dentro de una pantalla de texto ( literal de cadena ). Por ejemplo, el comando ABC WRITE '2 + 2 = `2+2`'
produce la salida 2 + 2 = 4 .
Ver también
Referencias
- ^ Dahdah, Howard. The AZ of Programming Languages: Bourne shell, or sh, Una entrevista en profundidad con Steve Bourne, creador del Bourne shell, or sh , Computerworld, 5 de marzo de 2009.
- ^ Herramientas eléctricas de Unix: Sustitución de comandos anidados 45.31.
- ^ Rosenblatt, Bill; Arnold Robbins (2002). Aprendiendo el Korn Shell (2 ed.). O'Reilly Media, Inc. pág. 127. ISBN 978-0-596-00195-7. Consultado el 20 de julio de 2010 .
La sintaxis de la sustitución de comandos es:
$(Unix command)
Se ejecuta el comando dentro del paréntesis, y todo lo que el comando escribe en la salida estándar (y en el error estándar) se devuelve como el valor de la expresión. - ^ Johnson, Chris (2009), "8", Pro Bash Programming: Scripting the Linux Shell , Nueva York, NY: Springer-Verlag New York, Inc., p. 84 , recuperado el 19 de diciembre de 2014 ,
Los nombres de archivos que contienen espacios son una abominación, pero son tan comunes hoy en día que los scripts deben tener en cuenta su posibilidad (¿o debería decir inevitabilidad?). ... El resultado de la sustitución de comandos está sujeto a la división de palabras
- ^ Hamilton C shell User guide: I / O redirection: Command substitution , Hamilton Laboratories, archivado desde el original el 19 de diciembre de 2014 , recuperado el 19 de diciembre de 2014