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 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. Esta función también se ha adoptado en otros lenguajes de programación , como Perl , PHP , Ruby y PowerShell de Microsoft en Windows . También aparece en CMD.EXE de Microsoft en el FORcomando y el ( )comando.
Sintaxis y semántica
Los intérpretes de comandos suelen implementar la sustitución de comandos creando un proceso hijo que ejecuta el primer comando, cuya salida estándar se redirige al intérprete, el cual lee dicha salida y la divide en palabras separadas por espacios en blanco . Dado que el intérprete no puede saber que tiene toda la salida del proceso hijo hasta que se cierra la tubería o el proceso hijo finaliza, espera hasta entonces antes de iniciar otro proceso hijo para ejecutar el segundo comando.
Este ejemplo de shell C muestra cómo buscar todos los archivos C que contienen la cadena y luego editar los que se encuentren con el editor. La notación sintáctica que se muestra aquí, ... , usando comillas invertidas como delimitadores , es el estilo original y es compatible con todos los shells Unix comunes.mallocfgrepvi` `
#!/bin/csh vi ` fgrep -l malloc *.c `Se han planteado objeciones tanto a la sintaxis , es decir, a cómo se escribe, como a la semántica , es decir, a cómo funciona.
Aunque es fácil de escribir, un factor importante para un procesador de comandos interactivo, la sintaxis ha sido criticada por ser difícil de anidar, colocando una sustitución de comando dentro de otra, porque los delimitadores izquierdo y derecho son iguales. [ 2 ] KornShell ( ksh ) [ 3 ] resolvió esto con una notación alternativa, $( ... , tomando prestada la notación utilizada para la sustitución de variables . Hoy en día, la mayoría de los 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 los espacios en blanco, también ha sido criticada. Funcionaba bien en los primeros sistemas Unix donde los nombres de archivo nunca contenían espacios, pero no funciona en absoluto bien en los sistemas modernos 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 *.ccomodín contiene un espacio, ese nombre de archivo se dividirá en dos argumentos separados para vi, claramente no es lo que se pretendía. El shell Hamilton C resolvió esto con una notación de doble comilla invertida, `` ... , que analiza en palabras solo en los saltos de línea. [ 5 ] ``
Este es un ejemplo de sustitución de comandos utilizando el ()operador en PowerShell :
$MiVariable = ( ls ) echo $MiVariableSustitución de expresiones
Una función relacionada, la sustitución de expresiones, se encuentra en los lenguajes Common Lisp y Scheme , invocada mediante el operador coma-arroba en una expresión marcada con el operador de comillas invertidas (o "cuasiquote"), y en ABC , mediante el uso de una expresión encerrada entre comillas invertidas dentro de una visualización de texto ( literal de cadena ). Por ejemplo, el comando ABC WRITE '2 + 2 = `2+2`'produce la salida 2 + 2 = 4.
Véase también
Referencias
- ↑ Dahdah, Howard. "El AZ de los lenguajes de programación: Bourne shell, o sh, una entrevista en profundidad con Steve Bourne, creador de Bourne shell, o sh". Archivado el 17 de marzo de 2010 en Wayback Machine , Computerworld , 5 de marzo de 2009.
- ↑ "Unix Power Tools: 45.31 Sustitución de comandos anidados" . Archivado del original el 12 de mayo de 2023. Consultado el 17 de marzo de 2010 .
- ↑ Rosenblatt, Bill; Arnold Robbins (2002). Aprendiendo la concha de Korn (2.ª ed.). O'Reilly Media, Inc. pág. 127. ISBN 978-0-596-00195-7Archivado del original el 22/05/2024 . Recuperado el 20/07/2010 .
La sintaxis de la sustitución de comandos es: El comando dentro del paréntesis se ejecuta, 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.
$(Unix command) - ↑ Johnson, Chris (2009), "8", Pro Bash Programming: Scripting the Linux Shell , Nueva York, NY: Springer-Verlag New York, Inc., pág. 84, ISBN 9781430219989, archivado del original el 22 de mayo de 2024 , recuperado el 19 de diciembre de 2014 ,
Los nombres de archivo 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
- ↑ Guía del usuario de la shell C de Hamilton: Redirección de E/S: Sustitución de comandos , Hamilton Laboratories, archivado del original el 19 de diciembre de 2014 , consultado el 19 de diciembre de 2014.
- Temas de lenguajes de programación
- Herramientas de programación Unix