Respostas:
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
A parte complicada é que o xargs realiza a invocação implícita do subshell. Aqui, é invocado explicitamente e o tubo não se torna parte do transportador pai
cat foo.bar | wc -l
ecat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
-I
vez de -J
; não há -J
opção para xargs
xargs
ter -J
opção que é equivalente ao -i
do linuxxargs
-J
Não está definido no POSIX, mas -I
é e tem um uso diferente do GNU do.)
Se você deseja processar todas as linhas de foo.txt, precisará usar um loop. Use &
para colocar o processo em segundo plano
while read line; do
echo $line | bar.sh &
done < foo.txt
Se sua entrada contiver espaços, configure temporariamente o separador de campo interno para a nova linha
# 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
OP usado.