Estou ficando confuso sobre o papel que a divisão de palavras desempenha zsh
. Eu não fui exposto a esse conceito ao programar em C, Python ou MATLAB, e isso despertou meu interesse em saber por que a divisão de palavras parece ser algo específico da programação em shell.
Já li sobre a divisão de palavras neste e em outros sites, mas não encontrei uma explicação clara do conceito. A Wikipedia tem uma definição de divisão de palavras, mas parece não ter referências sobre como se aplica aos shells do Unix.
Aqui está um exemplo da minha confusão em zsh
:
Nas Perguntas frequentes sobre o Z Shell , li o seguinte:
3.1: Por
$var
quevar="foo bar"
não faz o que eu espero?Na maioria dos derivados de Bourne-shell, variáveis de várias palavras, como
var="foo bar"
são divididas em palavras, são passadas para um comando ou usadas em umfor foo in $var
loop. Por padrão, o zsh não tem esse comportamento: a variável permanece intacta. (Isso não é um bug! Veja abaixo.) A opçãoSH_WORD_SPLIT
existe para fornecer compatibilidade.
No entanto, no Manual do Z Shell , li o seguinte:
SH_WORD_SPLIT (-y) <K> <S>
Faz com que a divisão de campos seja realizada em expansões de parâmetros não citadas. Observe que esta opção não tem nada a ver com a divisão de palavras. (Consulte Expansão de parâmetros.)
Por que diz que nadaSH_WORD_SPLIT
tem a ver com a divisão de palavras? A divisão de palavras não é exatamente do que se trata?
"word1 word2 word3"
em listas / matrizes do formulário"word1" "word2" "word3"
? Também atualizei o OP com uma fonte específica de confusão no zsh.$IFS
caracteres. Portanto, "divisão de campo" é um nome melhor. Mas "divisão de palavras" é freqüentemente usada para esse conceito na literatura de shell. A documentação do zsh está discutindo palavras.rc
(o shell plan9, também portado para Unix) para um design ainda melhor que o zsh quando se trata de variáveis e matrizes.A divisão de palavras não é realmente específica do shell.
A maioria dos programas que precisam analisar a entrada de texto usa alguma forma de divisão de palavras como primeira etapa. Isso é feito antes da identificação dessas "palavras", números, operadores, strings, tokens e quaisquer entidades semelhantes que eles precisem processar.
O que é específico dos shells é que eles precisam criar adequadamente a lista de argumentos dos comandos chamados (C argc / argv, python sys.argv), incluindo a passagem de argumentos com espaços incorporados, argumentos vazios, delimitadores personalizados e assim por diante. Muitos shells usam a variável IFS para permitir alguma flexibilidade lá.
fonte
Nesse caso específico de Zsh, a divisão de palavras é definida de maneira ligeiramente diferente da divisão de campos.
Considere
prog a b c
, ele passará em três argumentos, não importa como você definirIFS
. Isso é divisão de palavras .Se o fizer
A="a b c"; prog $A
, ele passará em três argumentos, seIFS
incluir espaço ou um argumento em contrário. Isso é divisão de campo .As definições aqui são sutis. O que o documento Zsh está tentando dizer é que, mesmo se você desabilitar essa opção,
prog a b c
ainda haverá argumentos separados (que é o que as pessoas sempre esperam).fonte