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?
la source
"${(@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${(f)"..."}
, les lignes vides seront sautées,"${(@f)...}"
préservées. C'est la même distinction entre$argv
et"$argv[@]"
. Cette"$@"
chose pour préserver tous les éléments d’un tableau provient du shell Bourne à la fin des années 70.Deux problèmes: d’abord, apparemment, les guillemets doubles n’interprètent pas non plus les échappements de barre oblique inversée (désolé pour cela :). Utilisez des
$'...'
citations. Et selonman zshparam
, pour collecter des mots dans un tableau, vous devez les placer entre parenthèses. Donc ça marche:Je ne peux pas répondre à votre Q3. J'espère que je n'aurai jamais à savoir de telles choses ésotériques :).
la source
Vous pouvez également utiliser tr pour remplacer newline par space:
la source
$IFS
. Traduire l'un en l'autre ne fait aucune différence.echo
où les entrées sont toutes plus ou moins des tas de mots séparés par ceux qui s'en soucient.