XARGS(1) General Commands Manual XARGS(1)

xargs - wykonuje polecenie z argumentami pobranymi ze standardowego wejścia

xargs [opcje] [polecenie [argumenty-początkowe]]

Ta strona opisuje wersję GNU programu xargs. xargs czyta ze standardowego wejścia listę elementów rozdzielonych spacjami (argumenty je zawierające mogą być ujęte w pojedyncze lub podwójne cudzysłowy albo spacje w argumentach mogą być poprzedzone przez odwrotne ukośniki) lub znakami nowego wiersza. Następnie wykonywane jest polecenie (domyślnie echo) jeden lub więcej razy z argumentami-początkowymi, po których następują argumenty przeczytane ze standardowego wejścia. Puste wiersze ze standardowego wejścia są ignorowane.

Wiersz poleceń dla polecenia jest budowany aż do momentu osiągnięcia systemowego limitu (chyba że podano opcje -n i -L). Podane polecenie może być wywołane tak wiele razy, jak to potrzebne, aby użyć całą listę elementów wejściowych. Ogólniej, wystąpi znacznie mniej wywołań polecenia niż było elementów na wejściu. Zwykle daje to znaczącą różnicę w wydajności. W przypadku niektórych poleceń, przydatne okaże się ich wykonanie równolegle; zob. opcja -P.

Ponieważ nazwy plików pod Uniksem mogą zawierać spacje i znaki nowego wiersza, to domyślne zachowanie jest często problematyczne: xargs niepoprawnie przetwarza pliki zawierające powyższe znaki. W takich sytuacjach lepiej jest używać opcji -0, co zapobiega takim problemom. Podczas używania tej opcji należy się upewnić, że program, który przetwarza wejście dla xargs także używa znaku null jako separatora. Jeśli na przykład tym programem jest GNU find, to odpowiednia opcja to -print0.

Jeśli uruchomione polecenia zakończy się z kodem 255, to xargs natychmiast przerwie swoje działanie bez czytania dalszego wejścia. Jeśli się to zdarzy, to na standardowym wyjściu błędów wypisywany jest komunikat błędu.

-0, --null
Nazwy plików wejściowych są zakończone znakiem null zamiast spacją, a cudzysłowy i odwrotne ukośniki nie mają specjalnego znaczenia (wszystkie znaki są brane dosłownie). Łańcuch końca pliku jest traktowany jak każdy inny. Opcja jest użyteczna, gdy argumenty mogą zawierać białe znaki, cudzysłowy, apostrofy lub odwrotne ukośniki. Ta opcja może być użyta do pobrania argumentów od programu GNU find uruchomionego z opcją -print0.
Czyta elementy z podanego pliku zamiast ze standardowego wejścia. Jeśli ta opcja jest używana, to standardowe wejście nie jest zmieniane podczas uruchamiania poleceń. W przeciwnym wypadku standardowe wejście jest przekierowywane z /dev/null.
Elementy wejściowe są zakończone podanym znakiem. Podany ogranicznik może być pojedynczym znakiem, cytowanym znakiem w stylu C, takim jak \n, albo ósemkowym lub szesnastkowym kodem ucieczki. Ósemkowe i szesnastkowe kody ucieczki są interpretowane tak, jak w przypadku polecenia printf. Nie są obsługiwane znaki wielobajtowe. Przy przetwarzaniu wejścia, znaki cytatu i odwrotny ukośnik nie są znakami specjalnymi; każdy znak wejścia jest przyjmowany dosłownie. Opcja -d wyłącza wszelkie łańcuchy końca pliku, które są traktowane jak każdy inny argument. Można użyć tej opcji, gdy wejście składa się z elementów oddzielonych znakiem nowego wiersza, aczkolwiek niemal zawsze, lepiej jest zaprojektować swój program, aby używał --null tam, gdzie to możliwe.
Nadaje łańcuchowi końca pliku wartość łańcuch-końca-pliku. Jeżeli ciąg oznaczający koniec pliku pojawi się w jednym z wierszy wejściowych, reszta danych jest ignorowana. Jeśli nie użyto opcji -E, ani -e, to łańcuch końca pliku nie jest używany.
Opcja jest synonimem opcji -E. Należy zamiast niej używać opcji -E, ponieważ jest zgodna z POSIX-em, podczas gdy ta opcja — nie jest. Jeśli pominięto łańcuch-końca-pliku, to łańcuch końca pliku nie jest używany. Jeśli nie podano ani opcji -E, ani opcji -e, to łańcuch końca pliku nie jest używany.
Zastępuje wszystkie wystąpienia łańcucha-do-zastąpienia w początkowych-argumentach argumentami przeczytanym ze standardowego wejścia. Ponadto, niecytowane odstępy nie separują argumentów, zamiast nich separatorem jest znak nowego wiersza. Automatycznie włączane są opcje -x oraz -L 1.
Opcja jest synonimem -I łańcuch-do-zastąpienia, jeśli podano łańcuch-do-zastąpienia. Jeśli brak argumentu łańcuch-do-zastąpienia, to działa to jak -I{}. Opcja jest przestarzała, należy zamiast niej używać -I.
Używa co najwyżej maksymalnej-liczby-wierszy niepustych wierszy danych wejściowych na każdy wiersz poleceń. Spacje na końcu wiersza powodują, że jest do niego dołączany następny wiersz. Automatycznie włączana jest opcja -x.
Synonim opcji -L. W przeciwieństwie do -L argument maksymalna-liczba-wierszy jest opcjonalny; jeśli nie jest podany to jego wartością domyślną jest jeden. Opcja -l jest przestarzała ponieważ standard POSIX wymienia -L zamiast niej.
Używa co najwyżej maksymalnej-liczby-argumentów na każdy wiersz poleceń. Może zostać użytych mniej argumentów niż maksymalna-liczba-argumentów, jeśli zostanie przekroczony ich rozmiar (patrz opcja -s), chyba że podana jest opcja -x, w którym to przypadku działanie programu xargs zostanie zakończone.
Uruchamia do maksymalnej-liczby-procesów jednocześnie; domyślnie 1. Jeśli maksymalna-liczba-procesów wynosi 0, to xargs uruchomi tak wiele procesów jednocześnie, jak to możliwe. Należy korzystać z opcji -n lub z opcji -L razem z -P; w innym przypadku może się zdarzyć, że będzie uruchomione tylko pojedyncze wykonanie. W trakcie działania xargs, można wysłać jego procesowi sygnał SIGUSR1 aby zwiększyć liczbę równoległych poleceń do uruchomienia, lub SIGUSR2 — aby ją zmniejszyć. Nie można zwiększyć liczby ponad wynikający z implementacji limit (ukazany za pomocą opcji --show-limits). Liczby nie można zmniejszyć poniżej 1. xargs nigdy nie przerywa swoich poleceń, przy żądaniu zmniejszenia liczby równoległych procesów, program jedynie poczeka, aż więcej niż jedno dotychczasowe polecenie się zakończy, zanim rozpocznie kolejne.

Proszę zauważyć, że to do procesów wywołujących należy poprawne zarządzanie równoległym dostępem do zasobów dzielonych. Przykładowo, jeśli więcej niż jeden z nich spróbuje wypisać na standardowe wyjście, wyjście zostanie utworzone w nieokreślonej (i najprawdopodobniej przemieszanej) kolejności, chyba że procesy w jakiś sposób współpracują ze sobą, aby temu zapobiec. Jednym ze sposobów uniknięcia takich problemów jest korzystanie z jakiegoś typu blokad. Mówiąc ogólnie, blokady zapewnią poprawną kolejność wyjścia, kosztem wydajności. Jeśli koszt zmniejszenia wydajności jest nieakceptowalny, należy doprowadzić do tego, aby każdy proces tworzył wyjście do oddzielnego pliku (lub innego typu oddzielnego zasobu).

Otwiera ponownie standardowe wejście jako /dev/tty w procesie potomnym, przed wykonaniem polecenia. Przydaje się to, gdy xargs ma uruchomić aplikację interaktywną.
Prosi użytkownika o potwierdzenie przed uruchomieniem każdego wiersza poleceń i przeczytaniem danych z terminala. Uruchamia wiersz poleceń tylko wtedy, gdy odpowiedź zaczyna się od „y” lub „Y”. Automatycznie włącza opcję -t.
Ustawia zmienną środowiskową nazwa na unikalną wartość dla każdego procesu potomnego. Wartości są używane ponownie, po zakończeniu potomków. Może to posłużyć np. jako prymitywny sposób rozłożenia obciążenia.
Jeżeli w danych ze standardowego wejścia nie znajdują się znaki inne niż spacje, polecenie nie jest uruchamiane. Normalnie polecenie jest uruchamiane jednorazowo, nawet gdy nie odczytano żadnych danych. Ta opcja jest rozszerzeniem GNU.
Używa co najwyżej maksymalnej-liczby-znaków w każdym wierszu poleceń, włączając w to polecenie, argumenty początkowe oraz znaki null kończące każdy z łańcuchów argumentów. Największa możliwa wartość zależy od systemu i jest wyliczana jako limit długości argumentów wywołania exec(2) pomniejszony o rozmiar środowiska, następnie pomniejszony o 2048 bajtów. Jeśli wartość ta jest większa niż 128 KiB, to 128 KiB jest używane jako wartość domyślna, w przeciwnym wypadku wartością domyślną jest wyliczona wartość maksymalna. 1 KiB (kibibajt) to 1024 bajty. xargs automatycznie dostosowuje się do silniejszych ograniczeń.
Wyświetla ograniczenia na długość wiersza poleceń, które są ustanawiane przez system operacyjny, przez xargs w przypadku rozmiaru wewnętrznego bufora lub przez opcję -s. Aby xargs nie zrobił nic poza wyświetleniem ograniczeń, jego wejście powinno być przekierowane z /dev/null (i być może powinna być podana opcja --no-run-if-empty).
Wiersz poleceń jest wypisywany na standardowe wyjście błędów przed wykonaniem polecenia.
Kończy działanie programu, jeżeli rozmiar zostanie przekroczony (patrz opcja -s).
Podaje wszystkie opcje programu xargs i kończy działanie.
Wypisuje numer wersji xargs i kończy działanie programu.

Opcje --max-lines (-L, -l), --replace (-I, -i) i --max-args (-n) wzajemnie się wykluczają. Jeśli poda się niektóre z nich w tym samym czasie, xargs zwykle użyje opcji podanej w wierszu polecenia jako ostatniej tj. zresetuje ona wartość sprzecznej opcji (podanej wcześniej) na jej wartość domyślną. Dodatkowo xargs wypisze ostrzeżenie na stderr. Wyjątkiem od tej reguły jest specjalna wartość maksymalnej-liczby-argumentów równa 1 („-n1”); jest ona ignorowana po opcji --replace i jej aliasach -I oraz -i, ponieważ nie prowadzi to do faktycznego konfliktu.

find /tmp -name core -type f -print | xargs /bin/rm -f

Wyszukuje a następnie usuwa pliki o nazwie core w katalogu /tmp i jego podkatalogach. Proszę zauważyć, że będzie to działać niepoprawnie jeśli którakolwiek z nazw plików zawiera znaki nowego wiersza lub spacji.

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

Wyszukuje a następnie usuwa pliki o nazwie core w katalogu /tmp i jego podkatalogach. Nazwy plików są przetwarzane w taki sposób, że nazwy plików lub katalogów zawierające znaki spacji lub nowego wiersza są poprawnie obsługiwane.

find /tmp -depth -name core -type f -delete

Wyszukuje a następnie usuwa pliki o nazwie core w katalogu /tmp i jego podkatalogach. Robi to jednak w sposób bardziej efektywny niż w poprzednim przykładzie (ponieważ nie używa fork(2) i exec(2), żeby uruchomić rm i nie potrzebuje dodatkowego procesu xargs).

cut -d: -f1 < /etc/passwd | sort | xargs echo
Tworzy zwięzłą listę wszystkich użytkowników systemu.

xargs zwraca następujące statusy zakończenia:

0
jeśli się powiedzie
123
jeśli dowolne z wywołanych poleceń zakończy się ze statusem 1-125
124
jeśli polecenie zakończyło się ze statusem 255
125
lub polecenie zostało zabite sygnałem
126
jeśli polecenie nie może być uruchomione
127
jeśli nie znaleziono polecenia
1
jeśli wystąpił jakiś inny błąd.

Kody zakończenia większe od 128 są używane przez powłokę do wskazania, że program został zabity przez sygnał.

Według stanu na wersję 4.2.9 programu GNU xargs, domyślnie xargs nie używa logicznego znacznika końca pliku. Standard POSIX (IEEE Std 1003.1, edycja 2004) na to pozwala.

Opcje -l i -i pojawiają się w wersji standardu POSIX z roku 1997, ale brak ich w wersji z roku 2004. Dlatego powinno się używać zamiast nich opcji - odpowiednio - -L i -I.

Opcja -o jest rozszerzeniem standardu POSIX, mającą na celu lepszą kompatybilność z BSD.

Standard POSIX pozwala implementacjom na stosowanie limitu rozmiaru argumentów funkcji exec. Limit ten może wynosić tylko 4096 bajtów, włączając w to rozmiar środowiska. Przenośne skrypty nie mogą polegać na tym, że większa wartość jest obsługiwana. Jednakże nie znamy żadnej implementacji, w której to ograniczenie jest tak małe. Można użyć opcja --show-limits, aby wyświetlić ograniczenia mające zastosowanie do bieżącego systemu.

Nie jest możliwe używanie xargs w sposób całkowicie bezpieczny, ponieważ zawsze istnieje luka czasowa pomiędzy utworzeniem listy plików wejściowych i użyciem tej listy przez polecenia, które xargs wykonuje. Jeśli inni użytkownicy mają dostęp do systemu, to mogą zmienić stan systemu plików podczas tej luki czasowej, tak żeby wymusić na poleceniach uruchomianych przez xargs wykonywanie akcji na plikach, które nie były zamierzone. Bardziej szczegółową dyskusję dotyczącą tego i podobnych problemów można znaleźć w rozdziale „Security Considerations” dokumentacji texinfo pakietu findutils. Opcja -execdir polecenia find często może stanowić bardziej bezpieczną alternatywę.

Podczas używania opcji -I każdy przeczytany wiersz wejściowy jest wewnętrznie buforowany. Oznacza to, że istnieje górne ograniczenie długości wierszy wejściowych akceptowanych przez xargs z opcją -I. Aby ominąć to ograniczenie można użyć opcji -s do zwiększenia rozmiaru bufora używanego przez xargs oraz można także użyć dodatkowego wywołania xargs, by zapewnić, że bardzo długie wiersze się nie pojawią. Na przykład:

jakieśpolecenie | xargs -s 50000 echo | xargs -I '{}' -s 100000 rm '{}'

Powyższe pierwsze wywołanie xargs nie ma ograniczenia na długość wiersza wejściowego, ponieważ nie używa opcji -i. Drugie wywołanie xargs ma takie ograniczenia, ale zapewniliśmy, że nigdy nie wystąpi wiersz dłuższy niż obsługiwany. Nie jest to idealne rozwiązanie. Zamiast tego opcja -i nie powinna wymuszać ograniczenia na długość wiersza — dlatego też ten opis pojawia się w rozdziale USTERKI. Problem nie występuje jeśli wejście pochodzi z programu find(1), ponieważ wypisuje on tylko jedną nazwę pliku w wierszu.

Strona internetowa z pomocą GNU findutils: https://www.gnu.org/software/findutils/#get-help
O błędach tłumaczenia programu prosimy poinformować przez https://translationproject.org/team/pl.html

Wszelkie inne problemy prosimy zgłaszać za pomocą systemu śledzenia błędów GNU Savannah:

Do ogólnej dyskusji na tematy związane z pakietem GNU findutils służy lista dyskusyjna bug-findutils:

Copyright © 1990-2022 Free Software Foundation, Inc. Licencja GPLv3+: GNU GPL w wersji 3 lub późniejszej https://gnu.org/licenses/gpl.html.
Jest to wolne oprogramowanie: można je zmieniać i rozpowszechniać. Nie ma ŻADNEJ GWARANCJI, w granicach określonych przez prawo.

find(1), kill(1), locate(1), updatedb(1), fork(2), execvp(3), locatedb(5), signal(7)

Pełna dokumentacja: https://www.gnu.org/software/findutils/xargs
albo dostępna lokalnie przez: info xargs

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Łukasz Kowalczyk <lukow@tempac.okwf.fuw.edu.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.