Je sais que, étant donné l="a b c",
echo $l | xargs ls
les rendements
ls a b c
Quelle construction donne
mycommand -f a -f b -f c
          Je sais que, étant donné l="a b c",
echo $l | xargs ls
les rendements
ls a b c
Quelle construction donne
mycommand -f a -f b -f c
          Réponses:
Une façon de le faire:
echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand
Cela suppose a, bet cne contient pas de blancs, de nouvelles lignes, de guillemets ou de barres obliques inverses. :)
Avec GNU, findutilvous pouvez gérer le cas général, mais c'est un peu plus compliqué:
echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand
Vous pouvez remplacer le |séparateur par un autre caractère, qui ne semble pas a, bou c.
Edit: Comme le note @MichaelMol , avec une très longue liste d'arguments, il existe un risque de débordement de la longueur maximale des arguments qui peuvent être passés mycommand. Lorsque cela se produit, le dernier xargsdivisera la liste et exécutera une autre copie de mycommand, et il y a un risque qu'elle ne soit pas terminée -f. Si vous vous inquiétez de cette situation, vous pouvez remplacer le dernier xargs -0ci-dessus par quelque chose comme ceci:
... | xargs -x -0 mycommand
Cela ne résoudra pas le problème, mais interrompra l'exécution mycommandlorsque la liste des arguments devient trop longue.
mycommand. Vous pouvez toujours ajouter -xau dernier xargs.
                    xargsdu tout, et de l'utiliser uniquement findsi elle peut être utilisée. Cette solution est dangereuse; vous devez au moins avertir du cas d'échec dans votre réponse.
                    findserait une meilleure solution générale, en particulier lorsque les arguments initiaux ne sont pas des noms de fichiers. :)
                    -fet avec un exemple d'outil lsutilisé pour l'illustration, @ not-a-user traite les noms de fichiers. Et donné findoffre l' -execargument, qui vous permet de construire une ligne de commande, ça va. (Tant qu'il mycommandest permis d'exécuter plus d'une fois. Si ce n'est pas le cas, alors nous avons un autre problème avec l'utilisation d' xargsici ...)
                    Une meilleure façon d'y remédier (OMI) serait:
dans zsh:
l=(a b c)
mycommand -f$^l
ou en utilisant le zipping de tableau pour que l'argument ne soit pas attaché à l'option:
l=(a b c) o=(-f)
mycommand "${o:^^l}"
De cette façon, cela fonctionne toujours si le ltableau contient des éléments vides ou des éléments contenant des espaces ou tout autre caractère problématique pour xargs. Exemple:
$ l=(a '' '"' 'x y' c) o=(-f)
$ printf '<%s>\n' "${o:^^l}"
<-f>
<a>
<-f>
<>
<-f>
<">
<-f>
<x y>
<-f>
<c>dans rc:
l=(a b c)
mycommand -f$ldans fish:
set l a b c
mycommand -f$l(AFAIK, rcet fishn'ont pas de fermeture éclair de tableau)
Avec des shells de type Bourne à l'ancienne bash, vous pouvez toujours le faire (en autorisant toujours n'importe quel caractère dans les éléments du $@tableau):
set -- a b c
for i do set -- "$@" -f "$i"; shift; done
mycommand "$@"
              for i; do args+=('-f' "$i");done; mycommand "${args[@]}". IDK si c'est plus rapide, mais l'ajout de 2 éléments à un tableau semble être O (n), tandis que votre setboucle copie et ré-analyse probablement la liste d'arguments accumulée à chaque fois (O (n ^ 2)).
                    
ARG_MAXet d'avoir un-fparamètre séparé de son paramètre apparié.