Відповіді:
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
Хитра частина полягає в тому, що xargs виконує неявне виклик підзарядки. Тут явно посилається, і труба не стає частиною материнського конвеєра
cat foo.bar | wc -l
іcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
-I
замість цього -J
; немає -J
можливості для xargs
xargs
має -J
опцію, еквівалентну версії -i
linuxxargs
-J
не визначено в POSIX, але -I
є та має інше використання, ніж GNU.)
Якщо ви хочете обробити всі рядки foo.txt, вам доведеться використовувати цикл. Використовуйте, &
щоб викласти процес на другий план
while read line; do
echo $line | bar.sh &
done < foo.txt
Якщо ваш вхід містить пробіли, тимчасово встановіть внутрішній роздільник поля на новий рядок
# 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
ОП.