J'essaie d'utiliser xargs pour exécuter une commande pour chaque argument fourni, mais malheureusement, l'indicateur --replace / -I ne semble pas fonctionner correctement lorsqu'il est conjugué à -n. Il semble que {} se développera dans la liste complète des arguments lus depuis stdin, quelle que soit l'option -n.
Malheureusement, tous les exemples sur le Web semblent être pour des commandes (mv, cp, rm) qui prendront plusieurs arguments où {} est développé.
Par exemple, lors de l'exécution:
echo a b c d | xargs -n 1 -I {} echo derp {}
La sortie est:
derp a b c d
Mais je m'attendais à:
derp a
derp b
derp c
derp d
Cependant, l'exécuter sans -I {} donne le résultat attendu:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
Existe-t-il un moyen d'y parvenir avec xargs? Mon intention ultime est de l'utiliser pour exécuter plusieurs sessions ssh (parallèles), comme
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
Je cours xargs (GNU findutils) 4.4.2
sur RHEL 6.3.
xargs
, mais pas GNUxargs
.man xargs
sur-I
:Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
Donc, il se comporte comme prévu.Réponses:
Vous pouvez faire écho avec les nouvelles lignes pour atteindre le résultat attendu. Dans votre cas, avec l'extension du serveur, ce serait:
la source
zsh
... Correction de ma réponse.echo
a besoin de l'-e
option.Vous pouvez utiliser un tuyau supplémentaire comme celui-ci,
L'utilisation intermédiaire de xargs 'echos' chaque lettre 'abcd' individuellement en raison de l'option '-n1'. Cela met chaque lettre sur sa propre ligne comme ça,
Il est important de comprendre lorsque vous utilisez -I (remplacement de chaîne), xargs implique -L, qui exécute la commande utilitaire (dans votre cas echo) une fois par ligne. De plus, vous ne pouvez pas utiliser -n avec -L car ils s'excluent mutuellement.
la source