поведение xargs -I

поведение xargs -I

Переменная 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

Связанный контент