" Sustitución de comandos " es el nombre de la función del lenguaje de shell que le permite ejecutar un comando y hacer que la salida de ese comando reemplace ( sustituir) el texto del comando.
No hay otra característica del lenguaje de shell que le permita hacer eso.
Una sustitución de comando, es decir, el expresión, es reemplazada por su salida, que es el uso principal de las sustituciones de comandos.
El comando que ejecuta la sustitución de comandos, se ejecuta en una subshell, lo que significa que tiene su propio entorno que no afectará el entorno del shell padre.
No todas las ejecuciones de subshell son sustituciones de comandos aunque ugh (vea más ejemplos al final).
Ejemplo que muestra que una sustitución de comando se ejecuta en una subcapa:
$ s=123 $ echo "hello $( s=world; echo "$s" )" hello world $ echo "$s" 123
Aquí, el la variable s
se establece en la cadena 123
. En la siguiente línea, se invoca echo
en una cadena que contiene el resultado de una sustitución de comando. La sustitución de comandos establece s
en la cadena world
y se hace eco de esta cadena. La cadena world
es la salida del comando en la sustitución del comando y, por lo tanto, si se ejecutó en set -x
, veríamos que la segunda línea anterior se habría expandido a echo "hello world"
, que produce hello world
en la terminal:
$ set -x $ echo "hello $( s=world; echo "$s" )" ++ s=world ++ echo world + echo "hello world" hello world
(bash
agrega un nivel adicional de +
mensajes a cada nivel de una subcapa de sustitución de comandos en la salida del seguimiento, otras shells pueden no hacer esto)
Por último, mostramos que el comando dentro de la sustitución de comandos se ejecutó en su propia subcapa, porque no afectó el valor de s
en el shell de llamada (el valor de s
sigue siendo 123
, no world
).
Hay otras situaciones en las que los comandos se ejecutan en subcapas, como en
echo "hello" | read message
En bash
, a menos que establezca la opción lastpipe
(solo en instancias no interactivas), la read
se ejecuta en una subcapa, lo que significa que $message
no se cambiará en el shell principal, es decir, si hace echo "$message"
después del comando anterior, se repetirá una cadena vacía (o cualquier valor $message
era antes).
Una sustitución de proceso en bash
también se ejecuta en una subcapa:
cat < <( echo "hello world" )
Esto también es distinto de una sustitución de comandos.
Comentarios