Я думал, что следующее сгруппирует выходные данные 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);
но я получил тот же результат, что и без него.
Наконец, следуя ответу об элементах List с пробелами в zsh , я также попытался использовать флаги расширения параметров вместо того, IFS
чтобы указывать zsh, как разделить входные данные и собрать элементы в массив, то есть:
array_of_lines=("${(@f)$(my_command)}");
Но я все еще получил тот же результат (расщепление происходит на n
)
С этим у меня есть следующие вопросы:
Q1. Каковы «правильные» способы сбора выходных данных команды в массив строк?
Q2. Как я могу указать IFS
разделить только на новые строки?
Q3. Если я использую флаги расширения параметров, как в моей третьей попытке выше (т. Е. Использую @f
), чтобы указать разбиение, игнорирует ли zsh значение IFS
? Почему это не работает выше?
"${(@f)...}"
так же, как${(f)"..."}
, но по-другому.(@)
внутри двойных кавычек означает «дать одно слово на элемент массива» и(f)
означает «разбить на массив по новой строке». PS: Пожалуйста, ссылку на документы