Strano comportamento dell'iterazione zsh sul contenuto di una variabile


2

Ho un comportamento strano con ZSH durante l'iterazione sul contenuto di una variabile. Una demo è meglio di una lunga chiacchierata in questo caso, quindi ecco il mio 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 »

Mi aspetto che la seconda iterazione abbia lo stesso risultato della prima. Ho provato quanto segue:

  • ZSH di altre persone (stessa distribuzione): ha funzionato bene
  • con bash sulla mia macchina: ha funzionato bene
  • rimuovi il mio .zshrc: il problema persiste.
  • se lo faccio

    file = $ (ls); per f in $ (echo $ files | tr '\ n' ''); fare l'eco $ f-SUF; fatto

funziona benissimo. Ma ancora una volta, se catturo il risultato dell'eco convogliato su tr, alla fine ottengo solo un -SUF.

Sono davvero senza idee su ciò che sta accadendo, qualcuno ha la minima idea?

Grazie.

Alcune informazioni:

  • Distribuzione: debian Wheezy
  • versione zsh: zsh 4.3.17 (x86_64-unknown-linux-gnu)

Se può essere di qualche utilità:

(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

Risposte:


1

Innanzitutto, è una cattiva idea analizzare l'output dils . Usa invece il globbing (vedi la sezione GENERAZIONE DI NOME DEL FILMATO in man zshexpn), nel tuo caso

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

Il motivo per cui entrambi i tuoi esempi sembrano funzionare in bash (fintanto che non ci sono spazi bianchi nei nomi dei file, ecc.) È che bash suddivide i parametri sugli spazi bianchi per impostazione predefinita, il che zshnon funziona. Puoi ottenere questo comportamento zshanche con questa opzione:

setopt SH_WORD_SPLIT

Spiegazione di man zshoptions

SH_WORD_SPLIT Fa sì che la divisione dei campi venga eseguita su espansioni di parametri non quotate . Nota che questa opzione non ha nulla a che fare con la suddivisione delle parole. (Vedi la sezione "Espansione dei parametri".)

Ma prendi sul serio i consigli forniti nel link sopra!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.