![Llamada a función de script: función vs $(función)](https://rvso.com/image/192236/Llamada%20a%20funci%C3%B3n%20de%20script%3A%20funci%C3%B3n%20vs%20%24(funci%C3%B3n).png)
Tomando como referencia el siguiente código por simplicidad.
#!/bin/bash
number=7
function doSomething() {
number=8
}
doSomething
echo "$number"
Se imprime 8
.
Pero con:
#!/bin/bash
number=7
function doSomething() {
number=8
}
$(doSomething)
echo "$number"
Se imprime 7
.
Tengo las siguientes preguntas:
- ¿Cuáles son losnombres técnicos¿para cada uno?, quiero decir
functioncall
y$(functioncall)
- ¿Cómo funciona cada enfoque? Parece que el primero considera (afecta) las variables fuera de la función misma, el segundo no
- Cuando es obligatorio utilizar un enfoque sobre el otro (se trata principalmente de problemas de rendimiento, por supuesto, si los hay), si hay otras razones, son bienvenidas.
Respuesta1
Estás experimentando las sutilezas de la sustitución de comandos.
La llamada
doSomething
es una llamada de función simple. Ejecuta la función, más o menos como si hubiera copiado y pegado los comandos de la función en el lugar donde la llama. Por lo tanto, sobrescribe la variable number
con el nuevo valor 8
.
La llamada
$(doSomething)
por otro lado es unsustitución de comando. Está destinado a ejecutar la función ydevolver cualquier función impresa en stdout
. Por lo general, no se usa "independiente", sino en asignaciones de variables, por ejemplo,
os_type=$(uname)
Eso ejecutará el comando uname
, que en un sistema Linux se imprimiría Linux
en la consola y almacenaría su resultado en la variable de shell os_type
. Por lo tanto, no tiene sentido utilizar una sustitución de comando con un comando o función que no genera nada, como su archivo doSomething
. De hecho, dado que la sustitución $(doSomething)
es básicamente un marcador de posición para la salida de doSomething
, la única razón por la que no aparece un error de secuencia de comandos es que su función no genera nada. ¿Había dicho, por ejemplo,
$(uname)
en lugar de
$(doSomething)
su shell habría intentado ejecutar el comando Linux
y habría generado un
Linux: No such file or directory
error (1) .
El punto clave para entender el efecto que observas es que en una sustitución de comando,el comando se ejecuta en una subshell, es decir, cualquier cambio realizado en las variables no se propaga hacia atrás al shell donde se ejecuta el script principal. Por lo tanto, aunque internamente ejecuta los comandos de doSomething
y establece una variable number
en 8
, lo hace en su propio proceso de shell que no tiene nada que ver con el proceso de shell que ejecuta su script (salvo por el hecho de que se stdout
está recuperando) y, por lo tanto, No se puede modificar la variable number
que utilizó en el script principal.
Para leer más, es posible que desee consultar
aquí en este sitio, o
para obtener más información general.
(1) Por otro lado, esto significa que puedes usar una sustitución de comando para ejecutar un comando cuyo nombre no conoces al momento de escribir el script, pero que puedes averiguar ejecutando otro comando que sí conoces.