XARGS(1) | General Commands Manual | XARGS(1) |
xargs - wykonaj polecenie z argumentami pobranymi ze standardowego wejścia
xargs [options] [command [initial-arguments]]
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 nowej linii. 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 linie ze standardowego wejścia są ignorowane.
The command line for command is built up until it reaches a system-defined limit (unless the -n and -L options are used). The specified command will be invoked as many times as necessary to use up the list of input items. In general, there will be many fewer invocations of command than there were items in the input. This will normally have significant performance benefits. Some commands can usefully be executed in parallel too; see the -P option.
Ponieważ nazwy plików pod Uniksem mogą zawierać spacje i znaki nowej linii, 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.
Please note that it is up to the called processes to properly manage parallel access to shared resources. For example, if more than one of them tries to print to stdout, the output will be produced in an indeterminate order (and very likely mixed up) unless the processes collaborate in some way to prevent this. Using some kind of locking scheme is one way to prevent such problems. In general, using a locking scheme will help ensure correct output but reduce performance. If you don't want to tolerate the performance difference, simply arrange for each process to produce a separate output file (or otherwise use separate resources).
The options --max-lines (-L, -l), --replace (-I, -i) and --max-args (-n) are mutually exclusive. If some of them are specified at the same time, then xargs will generally use the option specified last on the command line, i.e., it will reset the value of the offending option (given before) to its default value. Additionally, xargs will issue a warning diagnostic on stderr. The exception to this rule is that the special max-args value 1 ('-n1') is ignored after the --replace option and its aliases -I and -i, because it would not actually conflict.
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 nowej linii 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 nowej linii 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 echoTworzy zwięzła listę wszystkich użytkowników systemu.
xargs zwraca następujące kody wyjścia:
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.
The -o option is an extension to the POSIX standard for better compatibility with 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 dziura 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 dziury 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żda przeczytana linia wejściowa jest wewnętrznie buforowana. Oznacza to, że istnieje górne ograniczenie długości linii 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 linie 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ść linii wejściowej, ponieważ nie używa opcji -i. Drugie wywołanie xargs ma takie ograniczenia, ale zapewniliśmy, że nigdy nie wystąpi linia dłuższa niż obsługiwana. Nie jest to idealne rozwiązanie. Zamiast tego opcja -i nie powinna wymuszać ograniczenia na długość linii — dlatego też ten opis pojawia się w rozdziale BŁĘDY. Problem nie występuje jeśli wejście pochodzi z programu find(1), ponieważ wypisuje on tylko jedną nazwę pliku w linii.
Strona internetowa z pomocą GNU findutils:
<https://www.gnu.org/software/findutils/#get-help>
O błędach tłumaczenia poinformuj przez
<https://translationproject.org/team/pl.html>
Report any other issue via the form at the GNU Savannah bug tracker:
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> i Robert Luberda <robert@debian.org>
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.