J'aimerais pouvoir utiliser xargs
pour exécuter plusieurs paramètres dans différentes parties d'une commande.
Par exemple, les éléments suivants:
echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2
J'espère que ça reviendra
the number 1 comes before 2
the number 3 comes before 4
... etc
Est-ce réalisable? Je soupçonne que mon utilisation multiple de -I
est incorrecte.
sh
. La finsh
à la fin est ce qui est mis$0
.$0
est généralement ce qui contient le nom de l'interpréteur ou du script.sh
avececho $sh
lequel cela fonctionne. Donc finalesh
fonctionne comme un espace réservéDans le cas particulier de
printf
, vous pouvez toujours faire:car
printf
a unexargs
capacité intrinsèque à s'exécuter plusieurs fois si on lui donne plus d'arguments que nécessaire pour une seule invocation. Bien que cela ait peu d'avantages par rapport àEt pour les grandes listes, la
xargs
commande simple peut entraîner l'xargs
exécution de plusieurs instances deprintf
, dont certaines peuvent avoir un nombre impair d'arguments. Vous pouvez passer-n 1000
àxargs
pour vous prémunir contre cela, où 1000 est un nombre pair qui devrait être suffisamment petit pour ne pas atteindre la limite d' argument trop longue et suffisamment grande pour éviter d'exécuter autant deprintf
s.Notez que ce
xargs
serait appeler, non pas le shell de votre shellprintf
, mais l'externeprintf
, à chaque invocation dans un nouveau processus distinct.Notez également que pour une entrée vide, sauf sur certains BSD, elle fonctionnerait toujours
printf
une fois sans argument. GNUxargs
et compatible ont une option-r
(ou--no-run-if-empty
) pour éviter cela.Pour être clair, cette réponse simple est spécifique à votre
printf
exemple et ne fonctionnerait pas dans le cas général où vous devez passer deux paramètres à la fois à votre commande (comme ce serait le casdiff
par exemple). Pour résoudre le problème général aveczsh
, vous pouvez utiliser:la source
zsh
partie de ce qui précède est une vraie réponse, et la partiexargs
-sans aucune option n'est qu'une bizarrerie. Dans un tel cas, je considérerais de mettre la vraie réponse en premier. (2) Je suppose que vous avez une raison de ne pas utiliser de guillemets dans votrezsh
commande. Si c'est le cas, vous voudrez peut-être le dire, de peur que les gens ne lisent ce qui précède et commencent à penser que les citations ne sont pas importantes. (Ou incluez-les simplement, car ils ne font pas de mal.)awk -F'\t' '/match/{printf $1"\0"$2"\0"}' | xargs -0 printf -- '-args1 "%s" -args2 "%s"' | xargs mycommand
-0
la premièrexargs
pour la rendre plus fiable est vaincue si vous ne l'utilisez pas sur la seconde. De plus, le premier argument deprintf
(à la fois l'utilitaire autonome etawk
laprintf()
fonction de) est le format, vous ne devriez pas y utiliser de variables. Ici, tu pourrais faireawk -F'\t' '/match/{printf "-args1\0%s\0-args2\0%s\0", $1, $2}' | xargs -n400 -r0 mycommand
. Encore une fois,-n400
nécessaire pour garantir laxargs
transmission d'un certain nombre d'arguments qui est un multiple de 4. (notez que toutes lesawk
implémentations ne prennent pas en charge l'utilisation de ce\0
type ici).-0
Je ne l'ai pas utilisé pour le rendre plus fiable, je l'ai utilisé pour qu'il fasse ce que je voulais faire, ce qu'il fait.essaye ça:
la source
sh -c
script avecsh
(ou autre) dans$0
. Notez que cela$0
n'est pas inclus dans$@
si cela devait être utilisé par lesh -c
script, par exemple si le script étaitecho "the two numbers were $@"