Перенаправление на стандартный ввод вместо аргумента при использовании xargs [закрыто]

12

например, используя команду

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

foo.txtСодержит две строки

foo
bar

Приведенная выше команда ничего не печатает.

Райан
источник

Ответы:

6
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 

Сложность в том, что xargs выполняет неявный вызов subshell. Здесь sh вызывается явно и труба не становится частью родительского конвейера

Kondybas
источник
1
Спасибо, я обновил свой вопрос, чтобы предоставить более конкретный пример. но это не работает, как вы предложили ..
Райан
1
эхо не может читать со стандартного ввода, поэтому пайпинг к нему не имеет смысла. Сравните это: cat foo.bar | wc -lиcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Кондыбас
1
Я думаю, что вы имеете в виду -Iвместо -J; нет -Jвозможности для xargs
Hitechcomputergeek
@Hitechcomputergeek В версии FreeBSD xargsесть -Jопция, эквивалентная -iLinux- xargs
версии
@Kondybas Спасибо, что сказал мне это; Я не знал, что между ними есть разница. Вы можете доверять GNU, чтобы не следовать POSIX LOL. ( -Jне определено в POSIX, но -Iиспользуется и имеет другое назначение, чем GNU.)
Hitechcomputergeek
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     
Matteo
источник
Нет-нет, я тоже застрял. ТС хочет разбить файл на отдельные строки и
ввести
1
Мне нужно использовать xargs для параллельного процесса ..
Райан
ОК :-) Я только что посмотрел варианты xargsиспользуемого ОП.
Маттео