Технологические интерфейсы
Формирование и выполнение командных строк
Служебная программа xargs позволяет формировать и выполнять командные строки, объединяя зафиксированный набор начальных аргументов с аргументами, прочитанными со стандартного ввода:
xargs [-E логич_конец_файла] [-I заменяемая_цепочка] [-L число] [-n число] [-p] [-s размер] [-t] [-x] [утилита [начальный_аргумент ...]]
Программа xargs объединяет зафиксированный набор заданных начальных_аргументов с аргументами, прочитанными со стандартного ввода, и выполняет указанную утилиту (по умолчанию – echo ) в рамках сформированной командной строки, ожидая завершения выполнения. Данный процесс повторяется до достижения физического или логического конца файла стандартного ввода или до возвращения выполненной командной строкой кода завершения 255.
Аргументы, прочитанные со стандартного ввода, – это непрерывные цепочки символов, разделенные одним или несколькими пробелами или переводами строки; пустые строки игнорируются.
Опциям служебной программы xargs приписан следующий смысл.
-E логич_конец_файла
Цепочка символов логич_конец_файла считается признаком логического конца файла стандартного ввода.
-I заменяемая_цепочка
Режим вставки: утилита выполняется для каждой строки стандартного ввода, причем вся строка рассматривается как один аргумент и подставляется в начальные аргументы вместо каждого вхождения заменяемой цепочки. Допускается не более пяти начальных аргументов, содержащих одно или несколько подобных вхождений. Пробелы в начале вводимых строк отбрасываются. Сформированные аргументы не могут быть длиннее 255 символов. Опция -I включает опцию -x.
-L число
Выполнять утилиту для каждой группы из заданного числа непустых строк аргументов, прочитанных со стандартного ввода. Последний вызов утилиты может быть с меньшим числом строк аргументов. Считается, что строка заканчивается символом перевода строки, если только перед ним не стоит пробел; пробел в конце сигнализируют о том, что следующая непустая строка является продолжением данной.
-n число
Выполнить утилиту, используя максимально возможное количество аргументов, прочитанных со стандартного ввода, но не более заданного числа. Будет использовано меньше аргументов, если их общая длина превышает размер, специфицированный опцией -s, или если для последнего вызова их осталось меньше, чем заданное число.
-p
Режим с приглашением: xargs перед каждым вызовом утилиты запрашивает подтверждение. Включается режим трассировки ( -t ), за счет чего в стандартный протокол выводится командная строка, которая должна быть выполнена, а за ней – приглашение " ?...". Положительный ответ, прочитанный с устройства /dev/tty, приводит к выполнению утилиты ; в противном случае данный вызов утилиты игнорируется.
-s размер
Максимальный общий размер (в символах) каждого списка аргументов установить равным заданной величине; в рамках этого ограничения со стандартного ввода берется максимально возможное число аргументов. Будет использовано меньше аргументов, если более сильными окажутся ограничения, наложенные опциями -n или -L, или если встретится конец файла.
-t
Режим трассировки: каждая сформированная командная строка перед выполнением выдается в стандартный протокол.
-x
Завершить работу служебной программы xargs, если очередная сформированная командная строка, потребившая заданное опцией -n число аргументов или заданное опцией -L число строк, оказалась длиннее, чем специфицированный опцией -s размер.
Приведем несколько примеров применения служебной программы xargs. На всякий случай подчеркнем, что никто не утверждал, что Linux или какая-либо иная операционная система соответствует стандарту POSIX-2001. Весьма вероятно, что перед исполнением примеров их придется немного подправить.
Следующая однострочная shell-процедура пересылает все файлы из каталога $1 в каталог $2 и сообщает о каждой пересылке, перед тем как ее выполнить:
ls $1 | xargs -I {} -t mv $1/{} $2/{}
Еще одна однострочная shell-процедура применяет служебную программу diff к последовательным парам своих аргументов.
echo $* | xargs -n 2 diff
Пользователя спрашивают, какие объектные файлы из текущего каталога должны быть занесены в библиотеку mylib.a. При выполнении первого конвейера (см. ниже) файлы заносятся по одному; при выполнении второго заносится сразу много файлов.
ls *.o | xargs -p -L 1 ar -r mylib.a ls *.o | xargs -p -L 1 | xargs ar -r mylib.a
Отметим, что во втором звене второго конвейера в качестве подразумеваемой утилиты будет использована служебная программа echo.