Переменная 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), но этого не происходит. Что я делаю не так?
решение1
Обычное поведение 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.
решение2
Если вы используете 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