По-перше, я припускаю, що використання - lsце лише приклад. Ви не можете проаналізувати вихід lsбудь-якої оболонки, оскільки це неоднозначно. Прочитайте Чому ви не повинні розбирати вихід ls (1), якщо це для вас новина. У будь-якій оболонці для отримання списку файлів використовуйте символи, наприклад files=(*).
У zsh, як і в інших оболонках, результат заміни команд розбивається на слова на символи пробілу (точніше, за значенням IFS). (На відміну від інших оболонок, результат заміни команд не підлягає глобалізації в zsh.) Отже, якщо вихід lsкоманди є
hello world
wibble
потім files=($(ls))встановлює filesмасив містить 3 елементи: hello, worldі wibble.
Якщо підміна команд знаходиться в подвійних лапках, то розщеплення не проводиться. Ви можете виконати спеціальне розбиття за допомогою прапорців розширення параметрів . Використовуйте @прапор, щоб вказати, що результатом розщеплення має бути масив (як не дивно, вам потрібно зберегти розширення в подвійних лапках, тобто "${(@)…}", навіть якщо подвійний цитат буде розширюватися на кілька слів). Для розщеплення використовуйте sпрапор, наприклад, "${(@s:,:)…}"для розділення комами; fпрапор розщеплюється на тільки переклади рядків.
files=("${(@f)$(ls)}")
Зауважте, що правильний спосіб ітерації масиву взагалі полягає for f in $files[@]в тому, що $filesзнімає порожні елементи (тут це не має значення, оскільки елементи не будуть порожніми).
print $fінтерпретує $fяк перемикач, якщо він починається з а -і розширює зворотні риски в $f. Використовуйте print -r -- $fабо print -rn -- $fякщо ви не хочете додавати новий рядок після рядка.