Eu pensei que o seguinte agruparia a saída de my_commandem uma matriz de linhas:
IFS='\n' array_of_lines=$(my_command);
de modo que $array_of_lines[1]se referisse à primeira linha na saída de my_command, $array_of_lines[2]à segunda e assim por diante.
No entanto, o comando acima parece não funcionar bem. Parece também dividir a saída em my_commandtorno do caractere n, como verifiquei com print -l $array_of_lines, que acredito que imprime elementos de uma matriz linha por linha. Também verifiquei isso com:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
Numa segunda tentativa, pensei que adicionar evalpoderia ajudar:
IFS='\n' array_of_lines=$(eval my_command);
mas obtive exatamente o mesmo resultado que sem ele.
Por fim, seguindo a resposta em Listar elementos com espaços no zsh , também tentei usar sinalizadores de expansão de parâmetros em vez de IFSdizer ao zsh como dividir a entrada e coletar os elementos em uma matriz, ou seja:
array_of_lines=("${(@f)$(my_command)}");
Mas eu ainda tenho o mesmo resultado (divisão acontecendo n)
Com isso, tenho as seguintes perguntas:
Q1 Quais são as formas "apropriadas" de coletar a saída de um comando em uma matriz de linhas?
Q2 Como posso especificar IFSa divisão apenas em novas linhas?
Q3 Se eu usar sinalizadores de expansão de parâmetros como na minha terceira tentativa acima (ou seja, usar @f) para especificar a divisão, o zsh ignora o valor de IFS? Por que não funcionou acima?
"${(@f)...}"é o mesmo que${(f)"..."}, mas de uma maneira diferente.(@)aspas duplas internas significa "produzir uma palavra por elemento da matriz" e(f)"dividir em uma matriz por nova linha". PS: Link para os documentos