Primeiro, suponho que o uso de lsé apenas um exemplo. Você não pode analisar a saída de lsqualquer shell, porque é ambígua. Leia Por que você não deve analisar a saída de ls (1) se isso é novidade para você. Em qualquer shell, para obter uma lista de arquivos, use caracteres curinga, por exemplo files=(*).
No zsh, como em outros shells, o resultado da substituição de comandos é dividido em palavras com caracteres de espaço em branco (mais precisamente, de acordo com o valor de IFS). (Diferentemente de outros shells, o resultado da substituição do comando não está sujeito a globbing no zsh.) Portanto, se a saída do lscomando for
hello world
wibble
em seguida, files=($(ls))define a filesmatriz para conter 3 elementos: hello, worlde wibble.
Se a substituição do comando estiver entre aspas duplas, nenhuma divisão será realizada. Você pode executar uma divisão personalizada com sinalizadores de expansão de parâmetro . Use o @sinalizador para indicar que o resultado da divisão será uma matriz (estranhamente, é necessário manter a expansão entre aspas duplas, ou seja "${(@)…}", mesmo que a cadeia de aspas duplas se expanda para várias palavras). Para dividir, use a sbandeira, por exemplo, "${(@s:,:)…}"para dividir por vírgulas; a fbandeira se divide apenas em novas linhas.
files=("${(@f)$(ls)}")
Observe que a maneira correta de iterar sobre uma matriz em geral é for f in $files[@], como $filesretira elementos vazios (aqui, isso não importa porque os elementos não estarão vazios).
print $finterpreta $fcomo uma opção se começar com -ae expandir barras invertidas $f. Use print -r -- $fou print -rn -- $fse você não quiser adicionar uma nova linha após a sequência.