La expansión y la sustitución parecen ser intercambiables en el mismo contexto en el lenguaje de programación de shell. Por ejemplo, algunos documentos como el manual de referencia de Bash , Bash Hackers Wiki usan la palabra 'expansión' para explicar ' expansión de parámetros de shell '. Sin embargo, algunos otros documentos parecen preferir la palabra 'sustitución'. La Guía avanzada de secuencias de comandos Bash utiliza la sustitución de parámetros .
¿Hay alguna diferencia entre 'expansión' y 'sustitución' en términos de terminología de programación de shell?
shell-script
terminology
MS.Kim
fuente
fuente
variable expansion
,command substitution
. Cual es tu dudaman sh
yman set
. Y cuando tienes esas cosas, entonces haces los documentos específicos de shell.Respuestas:
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 expandimosthis
, obtenemosthat
. 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 ejecutarfoo 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:
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.fuente
Creo que la diferencia es generalmente mínima para ser notoria, y los términos a menudo se usan indistintamente. Sin embargo, si nos fijamos en las anteriores dos casos, se puede ver que en el primer ejemplo nos sustituto
$1
para$2
, como resultado de la expansión de$2
. Tan pronto como$2
no se puede ampliar, no hay sustitución.Ricitos de oro hace un buen punto sobre la existencia etérea de sustituciones. Como el gato de Schrodinger, supongo. Me recordó algo. Es posible que no esté familiarizado con esta forma de expansión de parámetros especificada por POSIX, pero funciona de forma opuesta a la forma anterior:
Ahora a veces quiero el mismo comportamiento pero por un
set
valor. POSIX no especifica ese comportamiento para nada exactamente. Pero, con un truco o dos, simplemente se gestiona:Pero:
fuente