Ich dachte, das Folgende würde die Ausgabe von my_command
in einem Array von Zeilen gruppieren :
IFS='\n' array_of_lines=$(my_command);
Das $array_of_lines[1]
würde sich auf die erste Zeile in der Ausgabe von my_command
, $array_of_lines[2]
auf die zweite und so weiter beziehen .
Der obige Befehl scheint jedoch nicht gut zu funktionieren. Es scheint auch die Ausgabe von my_command
um das Zeichen zu teilen n
, wie ich mit überprüft habe print -l $array_of_lines
, die ich glaube, druckt Elemente eines Arrays Zeile für Zeile. Ich habe dies auch überprüft mit:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
In einem zweiten Versuch dachte ich, das Hinzufügen eval
könnte helfen:
IFS='\n' array_of_lines=$(eval my_command);
aber ich habe genau das gleiche Ergebnis wie ohne.
Schließlich habe ich nach der Antwort auf Listenelemente mit Leerzeichen in zsh auch versucht, Parametererweiterungsflags zu verwenden, anstatt IFS
zsh mitzuteilen, wie die Eingabe aufgeteilt und die Elemente in einem Array gesammelt werden sollen, dh:
array_of_lines=("${(@f)$(my_command)}");
Aber ich habe immer noch das gleiche Ergebnis (Spaltung passiert am n
)
Damit habe ich folgende Fragen:
Q1. Was sind die "richtigen" Möglichkeiten, um die Ausgabe eines Befehls in einem Array von Zeilen zu sammeln?
Q2. Wie kann ich festlegen IFS
, dass nur Zeilenumbrüche geteilt werden?
Q3. Wenn ich Parametererweiterungsflags wie in meinem dritten Versuch oben (dh mithilfe von @f
) verwende, um die Aufteilung festzulegen, ignoriert zsh dann den Wert von IFS
? Warum hat es oben nicht funktioniert?
"${(@f)...}"
ist das gleiche wie${(f)"..."}
, aber auf andere Weise.(@)
in doppelten Anführungszeichen bedeutet "Ergib ein Wort pro Array-Element" und(f)
bedeutet "durch Zeilenumbruch in ein Array aufteilen". PS: Bitte verlinken Sie zu den Dokumenten