Je pensais que ce qui suit regrouperait la sortie de my_commanddans un tableau de lignes:
IFS='\n' array_of_lines=$(my_command);
de sorte que cela $array_of_lines[1]ferait référence à la première ligne de la sortie de my_command, $array_of_lines[2]à la seconde, etc.
Cependant, la commande ci-dessus ne semble pas bien fonctionner. Il semble également séparer la sortie my_commandautour du caractère n, comme je l'ai vérifié print -l $array_of_lines, ce qui, je crois, affiche les éléments d'un tableau ligne par ligne. J'ai aussi vérifié cela avec:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
Dans une seconde tentative, j'ai pensé que l'ajout evalpourrait aider:
IFS='\n' array_of_lines=$(eval my_command);
mais j'ai eu exactement le même résultat que sans.
Enfin, en suivant la réponse sur les éléments List avec des espaces dans zsh , j'ai également essayé d'utiliser des indicateurs de développement de paramètres au lieu d' IFSindiquer à zsh comment scinder l'entrée et collecter les éléments dans un tableau, à savoir:
array_of_lines=("${(@f)$(my_command)}");
Mais j'ai toujours le même résultat (le dédoublement se produit n)
Avec cela, j'ai les questions suivantes:
Q1. Quels sont les " moyens " appropriés pour collecter le résultat d'une commande dans un tableau de lignes?
Q2. Comment puis-je spécifier IFSde scinder uniquement sur les nouvelles lignes?
Q3. Si j'utilise les indicateurs d'expansion de paramètre comme dans ma troisième tentative ci-dessus (en utilisant @f) pour spécifier le fractionnement, zsh ignore-t-il la valeur IFS? Pourquoi ça n'a pas fonctionné dessus?
"${(@f)...}"est le même que${(f)"..."}, mais d'une manière différente.(@)Les guillemets doubles à l'intérieur signifient "donner un mot par élément de tableau" et(f)"se séparer en tableau par une nouvelle ligne". PS: S'il vous plaît lien vers les docs