Rediriger vers stdin au lieu d'argument lors de l'utilisation de xargs [fermé]


12

pour exmaple, en utilisant la commande

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

Le foo.txtcontient deux lignes

foo
bar

La commande ci-dessus n'imprime rien.

Réponses:


6
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 

La partie délicate est que xargs effectue l'invocation implicite de sous-shell. Ici, sh est invoqué explicitement et le tuyau ne devient pas la partie du convoyeur parent


1
Merci, j'ai mis à jour ma question pour fournir un exemple plus concret. mais cela ne fonctionne pas comme vous l'avez suggéré ..
— Ryan

1
echo ne peut pas lire depuis stdin, donc la tuyauterie n'a aucun sens. comparer ceci: cat foo.bar | wc -letcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
— Kondybas

1
Je pense que vous voulez dire -Iau lieu de -J; il n'y a pas d' -Joption pour xargs
— Hitechcomputergeek

@Hitechcomputergeek La version FreeBSD de l' option xargshave -Jest équivalente à celle -idu linuxxargs
— Kondybas

@Kondybas Merci de me l'avoir dit; Je ne savais pas qu'il y avait une différence entre les deux. Vous pouvez faire confiance à GNU pour ne pas suivre POSIX lol. ( -Jn'est pas défini dans POSIX mais -Iest et a une utilisation différente de celle de GNU.)
— Hitechcomputergeek

2

Si vous souhaitez traiter toutes les lignes de foo.txt, vous devrez utiliser une boucle. Utilisez &pour mettre le processus en arrière-plan

while read line; do
   echo $line | bar.sh &
done < foo.txt

Si votre entrée contient des espaces, définissez temporairement le séparateur de champ interne sur la nouvelle ligne

# save the field separator
OLD_IFS=$IFS

# new field separator, the end of line 
IFS=$'\n'

for line in $(cat foo.txt) ; do
   echo $line | bar.sh &
done

# restore default field separator  
IFS=$OLD_IFS     

Non, non, je suis coincé avec ça aussi. TS veut diviser le fichier en lignes séparées et les alimenter dans le script indépendamment
— Kondybas

1
Je dois utiliser des xargs pour mettre en parallèle le processus ..
— Ryan

OK :-) Je viens de chercher les options de xargsl'OP utilisé.
— Matteo
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.