stringtranslate.com

Sustitución de comandos

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 seguido siendo 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 CMD.EXE de Microsoft en el FORcomando y el ( )comando.

Sintaxis y semántica

Los shells suelen implementar la sustitución de comandos mediante la creación de un proceso secundario que ejecuta el primer comando y envía su salida estándar al shell, que lee esa salida y la analiza en palabras separadas por espacios en blanco . Como el shell no puede saber que tiene toda la salida del proceso secundario hasta que se cierra la tubería o el proceso secundario 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 fgrepy luego editar los que se encuentren usando el vieditor. La notación sintáctica que se muestra aquí, ` ...  `, que usa comillas invertidas como delimitadores , es el estilo original y es compatible con todos los shells Unix comunes.

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

Se han planteado objeciones tanto a la sintaxis (cómo se escribe) como a la semántica (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 tanto el delimitador izquierdo como el derecho son los mismos. [ 2] 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, la mayoría de los shells de UNIX admiten esta sintaxis. PowerShell de Microsoft también utiliza 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. 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 Windows y Linux modernos 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 es lo que se pretendía. Hamilton C shell resolvió esto con una notación de comillas dobles invertidas, `` ...  ``, 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 $MiVariable

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 utilizando el operador coma-arroba en una expresión marcada con el operador comilla invertida (o "cuasi-comilla"), y en ABC , utilizando 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

  1. ^ Dahdah, Howard. "La A a la Z 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.
  2. ^ "Unix Power Tools: 45.31 Sustitución de comandos anidados". Archivado desde el original el 2023-05-12 . Consultado el 2010-03-17 .
  3. ^ Rosenblatt, Bill; Arnold Robbins (2002). Aprendiendo a usar la concha de maíz (2.ª ed.). O'Reilly Media, Inc., pág. 127. ISBN 978-0-596-00195-7. Archivado desde el original el 22 de mayo de 2024 . 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.
  4. ^ Johnson, Chris (2009), "8", Programación Pro Bash: Creación de scripts para el shell de Linux, 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.
  5. ^ Guía del usuario de Hamilton C shell: Redirección de E/S: Sustitución de comandos, Hamilton Laboratories, archivado desde el original el 19 de diciembre de 2014 , consultado el 19 de diciembre de 2014