Перенаправлення на stdin замість аргументу при використанні xargs [закрито]


12

для exmaple, використовуючи команду

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 виконує неявне виклик підзарядки. Тут явно посилається, і труба не стає частиною материнського конвеєра


1
Дякую, я оновив своє запитання, щоб надати більш конкретний приклад. але це не працює, як ви запропонували ..
Райан

1
echo cant читати зі stdin, тому підключення до нього не має сенсу. порівняйте це: 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опцію, еквівалентну версії -ilinuxxargs
Кондібас

@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     

Ні-ні, я теж застряг у цьому. TS хочуть розділити файл на окремі рядки та подати їх у сценарій самостійно
Кондібас

1
Мені потрібно використовувати xargs для паралельного процесу ..
Ryan

Добре :-) Я просто роздивився параметри використовуваних xargsОП.
Маттео
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.