Myślałem, że następujące zgrupuje dane wyjściowe my_command
w tablicy wierszy:
IFS='\n' array_of_lines=$(my_command);
tak $array_of_lines[1]
by odnosiło się do pierwszego wiersza na wyjściu my_command
, $array_of_lines[2]
do drugiego i tak dalej.
Jednak powyższe polecenie wydaje się nie działać dobrze. Wydaje się, że dzieli także wynik my_command
wokół znaku n
, jak już sprawdziłem print -l $array_of_lines
, co, jak sądzę, drukuje elementy tablicy linia po linii. Sprawdziłem to również za pomocą:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
W drugiej próbie pomyślałem, że dodanie eval
może pomóc:
IFS='\n' array_of_lines=$(eval my_command);
ale mam dokładnie taki sam wynik jak bez niego.
Wreszcie, podążając za odpowiedzią dotyczącą elementów List ze spacjami w zsh , próbowałem również użyć flag rozwijania parametrów zamiast IFS
powiedzieć zsh, jak podzielić dane wejściowe i zebrać elementy w tablicę, tj .:
array_of_lines=("${(@f)$(my_command)}");
Ale nadal mam ten sam wynik (dzielenie się dzieje n
)
W związku z tym mam następujące pytania:
Pytanie 1 Jakie są „właściwe” sposoby gromadzenia danych wyjściowych polecenia w szeregu wierszy?
Q2 Jak mogę określić IFS
podział tylko na nowe wiersze?
Pytanie 3 Jeśli użyję flag rozszerzania parametrów, jak w mojej trzeciej próbie powyżej (tj. Przy użyciu @f
), aby określić podział, czy zsh ignoruje wartość IFS
? Dlaczego to nie zadziałało powyżej?
"${(@f)...}"
jest taki sam jak${(f)"..."}
, ale w inny sposób.(@)
wewnątrz podwójnych cudzysłowów oznacza „wydaj jedno słowo na element tablicy” i(f)
„podziel się na tablicę znakiem nowej linii”. PS: Proszę zamieścić link do dokumentacji