XARGS(1) | General Commands Manual | XARGS(1) |
xargs - wykonaj polecenie z argumentami pobranymi ze standardowego wejścia
xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]] [-L max-lines] [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s max-chars] [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs] [--interactive] [--verbose] [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits] [--version] [--help] [polecenie [początkowe-argumenty]]
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 /bin/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.
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.
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 sh -c 'emacs "$@" < /dev/tty' emacsUruchamia minimalną liczbę kopii Emacsa, jeden po drugim, potrzebną do edycji plików wymienionych na standardowym wejściu programu xargs. Przykład ten robi to samo, co opcja -o z BSD, ale w sposób bardziej elastyczny i przenośny.
xargs zwraca następujące kody wyjścia:
0, gdy polecenie zakończyło się sukcesem 123, jeżeli którekolwiek wywołanie polecenia zakończyło się z kodem wyjścia 1-125 124, jeżeli polecenie zakończyło się z kodem wyjścia 255 125, jeżeli polecenie zostało zakończone przez sygnał 126, jeżeli polecenie nie mogło być uruchomione 127, jeżeli polecenie nie zostało znalezione 1, jeżeli wystąpił 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.
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.
find(1), locate(1), locatedb(5), updatedb(1), fork(2), execvp(3), Finding Files (w dokumentacji Info lub wydane w druku)
Opcja -L nie jest kompatybilna z opcją -I, choć najprawdopodobniej powinna być.
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.
Najlepszą drogą do zgłoszenia błędu jest użycie formularza na stronie http://savannah.gnu.org/bugs/?group=findutils. Możliwe jest wówczas śledzenie postępu naprawiania błędu. Pozostałe komentarze dotyczące xargs(1) i ogólne, dotyczące pakietu findutils, można wysyłać na listę dyskusyjną bug-findutils. Aby się na nią zapisać, proszę wysłać e-mail do bug-findutils-request@gnu.org.
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Łukasz Kowalczyk (PTM) <lukow@tempac.okwf.fuw.edu.pl> i Robert Luberda <robert@debian.org>.
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 4.4.2 oryginału.