Comment répéter deux fois des variables dans xargs


21

Comment puis-je faire le deuxième écho pour tester l'écho dans cet exemple également:

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var Cela vous donnerait: Aucun fichier ou répertoire de ce type.

Réponses:


27

Écrivez simplement {}deux fois dans votre commande. Les éléments suivants fonctionneraient:

$ echo test | xargs -I {} echo {} {}
test test

Votre problème est de savoir comment les commandes sont imbriquées . Regardons ceci:

echo test | xargs -I {} echo {} && echo {}

bash s'exécutera echo test | xargs -I {} echo {}. S'il s'exécute correctement, echo {}est exécuté. Pour modifier l'imbrication, vous pouvez faire quelque chose comme ceci:

echo test | xargs -I {} sh -c "echo {} && echo {}"

Cependant, vous pourriez avoir des problèmes car l'approche pourrait être sujette à l'injection de code. Lorsque "test" est remplacé par du code shell, il est exécuté. Par conséquent, vous devez probablement transmettre l'entrée au shell imbriqué avec des arguments.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
Notez que vous obtiendrez des résultats inattendus dans votre dernier code si vous avez afile callod, littéralement, $(rm -f *). Il vaut mieux fairexargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@Kusalananda, merci. J'étais conscient du problème mais je ne pouvais pas penser à une solution simple à ce moment. J'ai intégré votre suggestion dans la réponse.
JojOatXGME

5

Une autre option consiste à utiliser -iflag, qui est le même que -I{}(cela implique que le remplacement est donné avec {}):

$ echo test | xargs -i echo {} {}

1
En attendant: This option is deprecated; use -I instead.a été ajouté au manuel man xargs.
Jonathan Komar

0

Pour moi, seul le minuscule fonctionne. J'avais des centaines d'images dans un répertoire et je voulais les mettre dans une liste. L' -Ioption majuscule i ne fonctionnait pas pour moi. Uniquement les minuscules. Probablement en raison de différences de version. Ces images avaient toutes des noms comme Daniel_(somenumber).jpg.

Cette syntaxe a fonctionné:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

Retour:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux ver 4.14.96-hw + # 80 SMP x86_64 GNU / Linux


2
J'ai ajouté une mise en forme à votre réponse pour la rendre plus lisible. J'espère l'avoir bien compris.
fra-san
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.