Я думал, что следующее сгруппирует выходные данные 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: Пожалуйста, ссылку на документы