Я думав, що наступне буде групувати результат my_command
у масиві рядків:
IFS='\n' array_of_lines=$(my_command);
так, що $array_of_lines[1]
буде посилатися на перший рядок у висновку my_command
, $array_of_lines[2]
на другий тощо.
Однак, здається, що команда вище не працює добре. Схоже, це також розділяє вихід my_command
навколо персонажа n
, як я це перевірив print -l $array_of_lines
, який, на мій погляд, друкує елементи масиву рядок за рядком. Я також перевірив це за допомогою:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
Під час другої спроби я подумав, що додавання eval
може допомогти:
IFS='\n' array_of_lines=$(eval my_command);
але я отримав такий самий результат, як і без нього.
Нарешті, слідуючи відповіді на елементи списку з пробілами в zsh , я також спробував використовувати прапори розширення параметрів замість того, IFS
щоб сказати zsh, як розділити вхід і зібрати елементи в масив, тобто:
array_of_lines=("${(@f)$(my_command)}");
Але я все одно отримав той самий результат (розкол відбувається на n
)
З цим у мене є такі питання:
Q1. Які "правильні" способи збору результатів команди в масив рядків?
Q2. Як я можу вказати IFS
розділити лише на нові рядки?
Q3. Якщо я використовую прапори розширення параметрів, як у моїй третій спробі вище (тобто, використовуючи @f
), щоб вказати поділ, чи zsh ігнорує значення IFS
? Чому це не вийшло вище?
"${(@f)...}"
те саме${(f)"..."}
, але по-іншому.(@)
всередині подвійних лапок означає "вивести одне слово на елемент масиву" і(f)
означає "розділити на масив за новим рядком". PS: Будь ласка, посилайтесь на документи