Je pensais que ce qui suit regrouperait la sortie de my_command
dans 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_command
autour 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 eval
pourrait 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' IFS
indiquer à 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 IFS
de 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