Me estoy confundiendo sobre el papel que juega la división de palabras zsh
. No he estado expuesto a este concepto al programar en C, Python o MATLAB, y esto ha despertado mi interés de por qué la división de palabras parece ser algo específico de la programación de shell.
He leído sobre la división de palabras en este y otros sitios antes, pero no he encontrado una explicación clara del concepto. Wikipedia tiene una definición de división de palabras, pero no parece tener referencias sobre cómo se aplica a los shells de Unix.
Aquí hay un ejemplo de mi confusión en zsh
:
En las preguntas frecuentes de Z Shell , leo lo siguiente:
3.1: ¿Por qué
$var
dóndevar="foo bar"
no hace lo que espero?En la mayoría de los derivados de Bourne-shell, las variables de varias palabras, como por ejemplo,
var="foo bar"
se dividen en palabras cuando se pasan a un comando o se usan en unfor foo in $var
bucle. Por defecto, zsh no tiene ese comportamiento: la variable permanece intacta. (¡Esto no es un error! Consulte a continuación).SH_WORD_SPLIT
Existe la opción de proporcionar compatibilidad.
Sin embargo, en el Manual de Z Shell , leí lo siguiente:
SH_WORD_SPLIT (-y) <K> <S>
Hace que la división de campo se realice en expansiones de parámetros sin comillas. Tenga en cuenta que esta opción no tiene nada que ver con la división de palabras. (Ver Expansión de parámetros).
¿Por qué dice que noSH_WORD_SPLIT
tiene nada que ver con la división de palabras? ¿No es la división de palabras precisamente de lo que se trata todo esto?
"word1 word2 word3"
en listas / matrices del formulario"word1" "word2" "word3"
? También he actualizado el OP con una fuente específica de confusión en zsh.$IFS
caracteres. Por lo tanto, "división de campo" es un nombre mejor. Pero "división de palabras" a menudo se usa para este concepto en la literatura de shell. La documentación de zsh está discutiendo sobre palabras.rc
(el shell plan9, también portado a Unix) para un diseño aún mejor que zsh cuando se trata de variables y matrices.La división de palabras no es realmente específica de la shell.
La mayoría de los programas que necesitan analizar el ingreso de texto usan alguna forma de división de palabras como primer paso. Se realiza antes de identificar a partir de estas "palabras", números, operadores, cadenas, tokens y cualquier entidad similar que necesiten procesar.
Lo que es específico con los shells es que tienen que construir adecuadamente la lista de argumentos de los comandos llamados (C argc / argv, python sys.argv), incluyendo pasar argumentos con espacios incrustados, argumentos vacíos, delimitadores personalizados, etc. Muchos shells usan la variable IFS para permitir cierta flexibilidad allí.
fuente
En este caso específico de Zsh, la división de palabras se define de manera ligeramente diferente a la división de campos.
Considere
prog a b c
, pasará tres argumentos sin importar cómo lo configureIFS
. Esta es la división de palabras .Si lo hace
A="a b c"; prog $A
, pasará tres argumentos siIFS
incluye espacio o un argumento de lo contrario. Esto es división de campo .Las definiciones aquí son sutiles. Lo que el documento Zsh intenta decir es que, incluso si deshabilita esa opción,
prog a b c
seguirá obteniendo argumentos separados (que es lo que la gente siempre espera).fuente