xargs
Тип | стандартна утиліта UNIX[d] і комп'ютерна програма |
---|
xargs (скорочення від «extended arguments»[1]) — це команда в Unix-подібних операційних системах яка використовується для конструювання та виконання команд з аргументами, які були отримані з stdin.
Команди командного рядка можуть приймати дані декількома способами. Деякі, такі як grep і awk, можуть приймати вхідні дані як аргументи командного рядка, так і з стандартного введення. Однак інші, такі як cp і echo можуть приймати лише як аргументи. Тому, коли є потреба в скрипті перетворити набір даних який виводить одна команда, в набір аргументів для іншої, або послідовність команд, для цього підходить xargs.
Для Microsoft Windows була портована версія GNU xargs, та є складовою колекції UnxUtils для Win32.[2] Основний перепис під назвою wargs є частиною проекту TextTools[3] з відкритим кодом. Також команда була портована в операційну систему IBM i.[4]
Одним з розповсюджених випадків використання команди xargs є видалення списку файлів за допомогою команди rm . Системи POSIX мають обмеження на максимальну загальну довжину команди[5][6].
Це обмеження дуже легко переповнити, наприклад якщо в каталозі /path/ дуже багато файлів, і ми спробуємо виконати команду
$ rm /path/*
Оболонка спробує розкрити /path/* в довжелезний рядок /path/file1 /path/file2 …, — і команда може завершитися помилкою з повідомленням про помилку «Argument list too long» (укр. Список аргументів задовгий)
Це можна переписати за допомогою команди xargs
:
$ find /path -type f -print | xargs rm
У наведеному прикладі утиліта find
видасть в stdout список файлів як текст, перенаправить цей список в stdin xargs
. Потім xargs
розбиває цей список на підсписки та викликає rm
один раз для кожного підсписку.
Деякі реалізації xargs також можна використовувати для розпаралелювання операцій, та обмежувати кількість потоків (підпрограм) за допомогою аргументу -P maxprocs
. У наведеному нижче прикладі буде породжено 24 процеси /cpu/bound/process, кожен з яких отримує один файл як аргумент, та буде обробляти його, і після того як який-небудь з процесів закінчить свою роботу, то він звільнить місце в наборі з 24 процесів, то xargs запустить новий процес.
$ find /path -name '*.foo' | xargs -P 24 /cpu/bound/process
Схожий функціонал пропонує утиліта GNU Parallel.
Застереження: якщо в іменах файлів, які обробляються, присутні такі символи як пробіл, кома, перенос рядка тощо — то це може призвести до непередбачуваної поведінки. Такі утілити як find, locate, grep і xargs мають опції -0
(або еквівалентно --null
) для таких випадків.
- ↑ The Unix Acronym List: The Complete List. www.roesler-ac.de. Процитовано 12 квітня 2020.
- ↑ Native Win32 ports of some GNU utilities. unxutils.sourceforge.net.
- ↑ Text processing tools for Windows. GitHub.
- ↑ IBM System i Version 7.2 Programming Qshell (PDF). IBM (англ.). Процитовано 5 вересня 2020.
- ↑ GNU Core Utilities Frequently Asked Questions. Процитовано 7 грудня 2015.
- ↑ The maximum length of arguments for a new process. www.in-ulm.de.