Réponses:
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
cat foo.bar | wc -l
etcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
-I
au lieu de -J
; il n'y a pas d' -J
option pour xargs
xargs
have -J
est équivalente à celle -i
du linuxxargs
-J
n'est pas défini dans POSIX mais -I
est et a une utilisation différente de celle de GNU.)
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
xargs
l'OP utilisé.