Comportamento estranho da iteração zsh sobre o conteúdo de uma variável

2

Eu tenho um behaiour estranho com ZSH quando iterativo sobre o conteúdo de uma variável. Uma demonstração é melhor do que uma longa conversa neste caso, então aqui está o meu problema:

(yoann@freya) test_bash » ls
file1  file2  file3
(yoann@freya) test_bash » for f in $(ls); do echo $f-SUF; done
file1-SUF
file2-SUF
file3-SUF
(yoann@freya) test_bash » files=$(ls); for f in $files; do echo $f-SUF; done 
file1
file2
file3-SUF
(yoann@freya) test_bash »

Espero que a segunda iteração tenha o mesmo resultado que a primeira. Eu tentei o seguinte:

  • ZSH de outras pessoas (mesma distribuição): funcionou bem
  • com o bash na minha máquina: funcionou bem
  • remove my .zshrc: o problema persistiu.
  • se eu fizer

    arquivos = $ (ls); para f em $ (echo $ files | tr '\ n' ''); faça echo $ f-SUF; feito

funciona bem. Mas, mais uma vez, se eu capturar o resultado do eco canalizado no tr, só obtenho um -SUF no final.

Estou realmente sem ideias sobre o que está acontecendo, alguém tem alguma dica?

Obrigado.

Algumas informações:

  • Distribuição: debian Wheezy
  • versão zsh: zsh 4.3.17 (x86_64-desconhecido-linux-gnu)

Se puder ser de alguma utilidade:

(yoann@freya) test_bash » locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=en_US.utf8
    
por YoannR 04.09.2013 / 11:36

1 resposta

1

Primeiro, é uma má idéia para analisar a saída de ls . Em vez disso, use globbing (veja a seção FILENAME GENERATION em man zshexpn ), no seu caso

for f in *; do
  echo ${f}-SUP
done

A razão pela qual ambos os seus exemplos parecem funcionar no bash (desde que não haja espaços em branco nos seus nomes de arquivo, etc.) é que o bash divide os parâmetros em espaços em branco por padrão, qual zsh não faz. Você também pode obter esse comportamento em zsh com essa opção:

setopt SH_WORD_SPLIT

Explicação de man zshoptions

SH_WORD_SPLIT Causes field splitting to be performed on unquoted parameter expansions. Note that this option has nothing to do with word splitting. (See the section 'Parameter Expansion'.)

Mas por favor leve os conselhos dados no link acima a sério!

    
por 04.09.2013 / 14:32

Tags