Je suis confus quant au rôle que joue le fractionnement de mots zsh
. Je n'ai pas été exposé à ce concept lors de la programmation en C, Python ou MATLAB, et cela a déclenché mon intérêt de savoir pourquoi le fractionnement de mots semble être quelque chose de spécifique à la programmation shell.
J'ai déjà lu sur le fractionnement de mots sur ce site et sur d'autres sites, mais je n'ai pas trouvé d'explication claire du concept. Wikipedia a une définition du fractionnement de mots mais ne semble pas avoir de références sur la façon dont il s'applique aux shells Unix.
Voici un exemple de ma confusion dans zsh
:
Dans la FAQ Z Shell , j'ai lu ce qui suit:
3.1: Pourquoi ne
$var
oùvar="foo bar"
pas ce que je pense?Dans la plupart des dérivés Bourne-shell, les variables de plusieurs mots telles que
var="foo bar"
sont divisées en mots lorsqu'elles sont passées à une commande ou utilisées dans unefor foo in $var
boucle. Par défaut, zsh n'a pas ce comportement: la variable reste intacte. (Ce n'est pas un bug! Voir ci-dessous.) L'optionSH_WORD_SPLIT
existe pour assurer la compatibilité.
Cependant, dans le manuel Z Shell , j'ai lu ce qui suit:
SH_WORD_SPLIT (-y) <K> <S>
Entraîne le fractionnement des champs à effectuer des extensions de paramètres sans guillemets. Notez que cette option n'a rien à voir avec le fractionnement de mots. (Voir Extension des paramètres.)
Pourquoi dit-il que cela SH_WORD_SPLIT
n'a rien à voir avec le fractionnement de mots? Le mot ne divise-t-il pas précisément de quoi il s'agit?
"word1 word2 word3"
en listes / tableaux du formulaire"word1" "word2" "word3"
? J'ai également mis à jour l'OP avec une source spécifique de confusion dans zsh.$IFS
caractères. Par conséquent, "division de champ" est un meilleur nom. Mais le «dédoublement de mots» est souvent utilisé pour ce concept dans la littérature sur les coques. La documentation zsh chipote sur les mots.rc
(le shell plan9, également porté sur Unix) pour une conception encore meilleure que zsh en ce qui concerne les variables et les tableaux.Le fractionnement de mots n'est pas vraiment spécifique au shell.
La plupart des programmes qui doivent analyser la saisie de texte utilisent une première forme de fractionnement de mots. Cela se fait avant d'identifier à partir de ces "mots", les nombres, les opérateurs, les chaînes, les jetons et toutes les entités similaires dont ils ont besoin pour traiter.
Ce qui est spécifique aux shells, c'est qu'ils doivent construire correctement la liste d'arguments des commandes appelées (C argc / argv, python sys.argv), y compris le passage d'arguments avec des espaces intégrés, des arguments vides, des délimiteurs personnalisés, etc. De nombreux shells utilisent la variable IFS pour y permettre une certaine flexibilité.
la source
Dans ce cas spécifique de Zsh, la division des mots est définie légèrement différemment de la division des champs.
Considérez
prog a b c
, il passera trois arguments, peu importe comment vous le définissezIFS
. C'est le dédoublement des mots .Si vous le faites
A="a b c"; prog $A
, il passera trois arguments siIFS
inclut l'espace ou un argument sinon. C'est le fractionnement de champ .Les définitions ici sont subtiles. Ce que le document Zsh essaie de dire, c'est que, même si vous désactivez cette option, vous
prog a b c
obtiendrez toujours des arguments séparés (ce à quoi les gens s'attendent toujours).la source