Saya pikir yang berikut ini akan mengelompokkan output my_command
dalam array baris:
IFS='\n' array_of_lines=$(my_command);
sehingga $array_of_lines[1]
akan merujuk pada baris pertama dalam output dari my_command
, $array_of_lines[2]
ke yang kedua, dan sebagainya.
Namun, perintah di atas sepertinya tidak berfungsi dengan baik. Tampaknya juga membagi output my_command
sekitar karakter n
, seperti yang telah saya periksa print -l $array_of_lines
, yang saya percaya mencetak elemen-elemen dari array baris demi baris. Saya juga sudah memeriksa ini dengan:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
Dalam upaya kedua, saya pikir menambahkan eval
dapat membantu:
IFS='\n' array_of_lines=$(eval my_command);
tapi saya mendapat hasil yang sama persis tanpa itu.
Akhirnya, mengikuti jawaban pada elemen Daftar dengan spasi di zsh , saya juga mencoba menggunakan flag ekspansi parameter alih-alih IFS
memberi tahu zsh cara membagi input dan mengumpulkan elemen menjadi array, yaitu:
array_of_lines=("${(@f)$(my_command)}");
Tapi saya masih mendapat hasil yang sama (splitting terjadi pada n
)
Dengan ini, saya punya pertanyaan berikut:
Q1. Apa cara "yang tepat" untuk mengumpulkan output dari perintah dalam array baris?
Q2. Bagaimana saya dapat menentukan IFS
untuk membagi pada baris baru saja?
Q3. Jika saya menggunakan flag ekspansi parameter seperti pada upaya ketiga saya di atas (yaitu menggunakan @f
) untuk menentukan pemisahan, apakah zsh mengabaikan nilai IFS
? Mengapa itu tidak berhasil?
"${(@f)...}"
sama dengan${(f)"..."}
, tetapi dengan cara yang berbeda.(@)
di dalam tanda kutip ganda berarti "menghasilkan satu kata per elemen array" dan(f)
berarti "dibagi menjadi array dengan baris baru". PS: Tolong tautkan ke dokumen