Перенаправление на стандартный ввод вместо аргумента при использовании 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 вызывается явно и труба не становится частью родительского конвейера


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     

Нет-нет, я тоже застрял. ТС хочет разбить файл на отдельные строки и
ввести

1
Мне нужно использовать xargs для параллельного процесса ..
Райан

ОК :-) Я только что посмотрел варианты xargsиспользуемого ОП.
Маттео
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.