Ответы:
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
Сложность в том, что xargs выполняет неявный вызов subshell. Здесь sh вызывается явно и труба не становится частью родительского конвейера
cat foo.bar | wc -lиcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
-Iвместо -J; нет -Jвозможности для xargs
xargsесть -Jопция, эквивалентная -iLinux- xargs
-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используемого ОП.