Pensé que lo siguiente agruparía la salida de my_command
en una matriz de líneas:
IFS='\n' array_of_lines=$(my_command);
entonces eso $array_of_lines[1]
se referiría a la primera línea en la salida de my_command
, $array_of_lines[2]
a la segunda, y así sucesivamente.
Sin embargo, el comando anterior no parece funcionar bien. Parece que también divide la salida de my_command
alrededor del personaje n
, como lo he comprobado print -l $array_of_lines
, con lo que creo imprime elementos de una matriz línea por línea. También he comprobado esto con:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
En un segundo intento, pensé que agregar eval
podría ayudar:
IFS='\n' array_of_lines=$(eval my_command);
pero obtuve exactamente el mismo resultado que sin él.
Finalmente, siguiendo la respuesta en Lista de elementos con espacios en zsh , también he intentado usar banderas de expansión de parámetros en lugar de IFS
decirle a zsh cómo dividir la entrada y recopilar los elementos en una matriz, es decir:
array_of_lines=("${(@f)$(my_command)}");
Pero todavía obtuve el mismo resultado (división en curso n
)
Con esto, tengo las siguientes preguntas:
Q1. ¿Cuáles son las formas "adecuadas" de recopilar la salida de un comando en una matriz de líneas?
Q2 ¿Cómo puedo especificar IFS
dividir solo en líneas nuevas?
Q3. Si uso banderas de expansión de parámetros como en mi tercer intento anterior (es decir, usando @f
) para especificar la división, ¿zsh ignora el valor de IFS
? ¿Por qué no funcionó arriba?
"${(@f)...}"
es lo mismo que${(f)"..."}
, pero de una manera diferente.(@)
dentro de comillas dobles significa "producir una palabra por elemento de matriz" y(f)
significa "dividir en una matriz por nueva línea". PD: Enlace a los documentos