Ho pensato che il seguente avrebbe raggruppato l'output di my_command
in 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_command
attorno 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 eval
potesse 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 IFS
dire 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 IFS
di 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