xargs

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) для таких випадків.

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. The Unix Acronym List: The Complete List. www.roesler-ac.de. Процитовано 12 квітня 2020.
  2. Native Win32 ports of some GNU utilities. unxutils.sourceforge.net.
  3. Text processing tools for Windows. GitHub.
  4. IBM System i Version 7.2 Programming Qshell (PDF). IBM (англ.). Процитовано 5 вересня 2020.
  5. GNU Core Utilities Frequently Asked Questions. Процитовано 7 грудня 2015.
  6. The maximum length of arguments for a new process. www.in-ulm.de.