cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
Parte complicada é que xargs executa invocação de subshell implícita. Aqui sh invocado explicitamente e pipe não se torna a parte do transportador pai
por exemplo, usando o comando
cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"
O foo.txt
contém duas linhas
foo
bar
O comando acima não imprime nada.
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
Parte complicada é que xargs executa invocação de subshell implícita. Aqui sh invocado explicitamente e pipe não se torna a parte do transportador pai
Se você quiser processar todas as linhas de foo.txt, você terá que usar um loop. Use &
para colocar o processo em segundo plano
while read line; do
echo $line | bar.sh &
done < foo.txt
Se a sua entrada contiver espaços, defina 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