Дивна поведінка ітерації zsh над змістом змінної


2

Я маю дивне поведінку з ZSH при переборі вмісту змінної. Демо в цьому випадку краще, ніж довга розмова, тому ось моя проблема:

(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 »

Я очікую, що друга ітерація матиме той же результат, що і перший. Я спробував наступне:

  • чужий ZSH (такий же розподіл): працював нормально
  • з bash на моїй машині: працював нормально
  • видалити мій .zshrc: проблема не зник.
  • якщо я

    files = $ (ls); для f з $ (echo $ files | tr 'n' ''); робити echo $ f-SUF; зроблено

він працює нормально. Але ще раз, якщо я захоплю результат результату луна, що надходить на tr, я отримую тільки один -SUF в кінці.

Я дійсно не маю ідеї про те, що відбувається, чи є хто-небудь поняття?

Дякую.

Деякі відомості:

  • Розподіл: debian Wheezy
  • zsh версія: zsh 4.3.17 (x86_64-unknown-linux-gnu)

Якщо це може бути будь-якого використання:

(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

Відповіді:


1

По-перше, це a Погана ідея розбору висновку ls. Замість цього скористайтеся глобусом (див. Розділ FILERAME GENERATION в man zshexpn ), у вашому випадку

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

Причина того, що обидва ваші приклади, здається, працюють у bash (як довго немає пробілів у іменах файлів тощо), це, що bash розбиває параметри на білі пробіли за замовчуванням, котрий zsh не робить. Ви можете отримати цю поведінку в zshтакож з цією опцією:

setopt SH_WORD_SPLIT

Пояснення від man zshoptions

SH_WORD_SPLIT Виконує розщеплення поля   розкладання параметрів, що не котируються. Зверніть увагу, що цей параметр не має нічого   робити з розбиттям слів. (Див. Розділ "Розширення параметрів".)

Але будь ласка, візьміть поради, наведені у вищезгаданому посиланні, серйозно!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.