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: проблема не устранена.
  • если я сделаю

    файлы = $ (Ls); для f в $ (echo $ files | tr '\n' ''); do 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 ответ1

1

Во-первых, плохая идея - анализировать вывод ls. Вместо того, чтобы использовать подстановку (смотрите раздел FILENAME ПОКОЛЕНИЕ в man zshexpn в вашем случае

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

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

setopt SH_WORD_SPLIT

Объяснение от man zshoptions

SH_WORD_SPLIT Вызывает разделение полей при раскрытии параметров без кавычек . Обратите внимание, что эта опция не имеет ничего общего с разделением слов. (См. Раздел «Расширение параметров».)

Но, пожалуйста, отнеситесь к советам, данным в ссылке выше, серьезно!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .