например, используя команду
cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"
Содержит foo.txt
две строки
foo
bar
Приведенная выше команда ничего не выводит.
решение1
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
Хитрость в том, что xargs выполняет неявный вызов подоболочки. Здесь sh вызывается явно, а pipe не становится частью родительского конвейера
решение2
Если вы хотите обработать все строки 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