La sustitución es casi sinónimo de expansión en este contexto porque sus significados se superponen. Ninguno de los dos es una subcategoría bastante completa del otro, aunque en la sección del Manual de GNU a la que hace referencia hay sustituciones que se consideran parte de una expansión general.
Una expansión es extraer el valor de un identificador. Por ejemplo, si this=that
, cuando nos expandimos this
, obtenemos that
. Una expansión que no implica sustitución está predeterminada porque el valor utilizado ya existe y simplemente debe recuperarse, aunque esto incluye combinar valores recuperados / explícitos (como con "expansión aritmética").
Una sustitución crea un valor como resultado de una operación explícita de entrada / salida. Por ejemplo, si this=$(foo bar)
, this
es el resultado de ejecutar foo bar
y capturar su salida. 1 Aunque el valor resultante de una sustitución puede ser completamente predecible, es diferente del obtenido en una expansión normal porque en realidad no existe hasta que se lleva a cabo la sustitución: se produce.
Las sustituciones vienen en dos sabores, comando y proceso , que son algo simétricos:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
El "comando" en el primero es ls
, al igual que el "proceso" en el segundo. Podríamos decir que lo que se está sustituyendo es realmente el final de una tubería. La sustitución del proceso se superpone con la redirección . Sin embargo, esto es técnicamente demasiado restrictivo, lo que nos lleva a la nota al pie ...
foo bar
en este caso podría ser una función de shell interna, en cuyo caso no hay E / S entre procesos. La existencia de funciones integradas de shell oscurece menos esta diferencia. En términos de contenido, la entrada y la salida serán las mismas.
variable expansion
,command substitution
. Cual es tu duda