Eu pensei que o seguinte agruparia a saída de my_command
em 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_command
torno 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 eval
poderia 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 IFS
dizer 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 IFS
a 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