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?
fonte
"${(@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${(f)"..."}
iria pular linhas vazias,"${(@f)...}"
preserva-os. Essa é a mesma distinção entre$argv
e"$argv[@]"
. Essa"$@"
coisa para preservar todos os elementos de uma matriz vem do shell Bourne no final dos anos 70.Duas questões: primeiro, aspas aparentemente duplas também não interpretam escapes de barra invertida (desculpe por isso :). Use
$'...'
aspas. E de acordo comman zshparam
, para coletar palavras em uma matriz, você precisa colocá-las entre parênteses. Então, isso funciona:Não consigo responder ao seu terceiro trimestre. Espero nunca ter que saber coisas tão esotéricas :).
fonte
Você também pode usar tr para substituir a linha nova por espaço:
fonte
$IFS
. Traduzir um para o outro não faz diferença.echo
, onde entradas são todas mais ou menos pilhas de palavras separadas por quem se importa.