Ho pensato che il seguente avrebbe raggruppato l'output di my_commandin una matrice di linee:
IFS='\n' array_of_lines=$(my_command);
in modo che $array_of_lines[1]si riferisca alla prima riga nell'output di my_command, $array_of_lines[2]alla seconda e così via.
Tuttavia, il comando sopra non sembra funzionare bene. Sembra anche dividere l'output di my_commandattorno al personaggio n, come ho verificato print -l $array_of_lines, che credo stampa elementi di un array riga per riga. Ho anche controllato questo con:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
In un secondo tentativo, ho pensato che l'aggiunta evalpotesse aiutare:
IFS='\n' array_of_lines=$(eval my_command);
ma ho ottenuto lo stesso esatto risultato senza di esso.
Infine, seguendo la risposta sugli elementi della lista con spazi in zsh , ho anche provato a usare i flag di espansione dei parametri invece di IFSdire a zsh come dividere l'input e raccogliere gli elementi in un array, cioè:
array_of_lines=("${(@f)$(my_command)}");
Ma ho ancora ottenuto lo stesso risultato (si sta verificando una divisione n)
Con questo, ho le seguenti domande:
Q1. Quali sono i modi "corretti" per raccogliere l'output di un comando in una matrice di righe?
Q2. Come posso specificare IFSdi dividere solo su newline?
Q3. Se uso i flag di espansione dei parametri come nel mio terzo tentativo sopra (ovvero usando @f) per specificare la divisione, zsh ignora il valore di IFS? Perché non ha funzionato sopra?
"${(@f)...}"è lo stesso di${(f)"..."}, ma in modo diverso.(@)tra virgolette doppie significa "cedere una parola per elemento di array" e(f)significa "diviso in un array per newline". PS: Link ai documenti