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.