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.

Ryan
la source

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

Kondybas
la source
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     
Matteo
la source
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