1

Переменная var содержит несколько аргументов, каждый из которых разделен новой строкой.

echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three

Однако, опуская символы -I и % , я получаю следующее:

echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three

Я когда-то читал {} заменил бы текущий аргумент (как find делает), но этого не происходит. Что я делаю неправильно?

2 ответа2

3

Обычное поведение xargs - вставить как можно больше аргументов в командную строку любой команды, которую он запускает, итерируя до тех пор, пока они не выполнят их все. При использовании этого способа это решение проблемы ограничений длины командной строки.

Но когда вы указываете опцию -I , она запускает команду для каждого аргумента индивидуально , по одному. Я не думаю, что это совершенно очевидно в документации по опции Linux xargs -I но это то, что они имеют в виду.

-I replace-str
       Replace occurrences of replace-str in the initial-arguments with
       names read from standard input.  Also, unquoted  blanks  do  not
       terminate  input  items;  instead  the  separator is the newline
       character.  Implies -x and -L 1.
0

Если вы используете GNU Parallel вместо xargs, вы можете контролировать, какое поведение вы хотите:

# 1 line at a time
echo "$var" | parallel echo ABC {}
# Many lines at a time (divided by # cpu)
echo "$var" | parallel -X echo ABC {} 
# Many lines at a time (not divided)
echo "$var" | parallel -Xj1 echo ABC {} 

Установка GNU Parallel занимает буквально 10 секунд:

wget pi.dk/3 -qO - | sh -x

Посмотрите вступительные видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .