MC, 2012
Ilustracja do artykułu: xargs Linux - Używanie standardowego wejścia jako parametr do innego programu

xargs Linux - Używanie standardowego wejścia jako parametr do innego programu

Wysłanie danych na standardowe wejście programu nie stanowi najmniejszego problemu. Schody zaczynają się w momencie, w którym chcielibyśmy przesłać w podobny sposób argumenty do programu, np. z pliku tekstowego. Na szczęście problem ten jest tylko pozorny, ponieważ został przewidziany i rozwiązany. Dlatego w tym artykule chciałbym pokrótce przedstawić polecenie xargs.

Co robi polecenie xargs?

Jak pewnie łatwo się domyślić ze wstępu, polecenie xargs czyta ze standardowego wejścia, a następnie wykonuje wskazany program, przekazując do niego wczytane parametry. Warto wiedzieć o dwóch domyślnych cechach tej komendy. Jeśli nie wskażemy, jaki program ma zostać wykonany, to będzie to echo. Druga ważna sprawa to fakt, że standardowo znakiem oddzielającym kolejne argumenty we czytanym strumieniu wejściowym jest jednocześnie spacja, znak nowego wiersza, czy tabulator, czyli po prostu jakikolwiek odstęp.

To może jakiś przykład?

Sprawdźmy, jak to działa. Załóżmy, że mamy plik wejsciowy.txt o następującej zawartości:
dom plot drzewo
brama	pies
rzeka
las
Następnie wydajmy polecenie:
$ xargs < wejsciowy.txt
dom plot drzewo brama pies rzeka las

Widzimy, że wszystkie słowa z pliku, niezależnie czy dzieliła je spacja, znak nowego wiersza czy tabulator zostały przetworzone na argumenty i przesłane do polecenia echo. Tutaj również objawia się kolejna cecha polecenia xargs. Mianowicie widzimy w powyższym outpucie, że zawsze przesyłana jest do programu maksymalna możliwa liczba argumentów.

Jak ograniczyć liczbę przesyłanych parametrów?

Najpierw wprowadźmy niewielką modyfikację do naszego pliku wejsciowy.txt:
dom plot drzewo
brama	pies
rzeka
"las polanka"
Aby ograniczyć liczbę jednorazowo przesyłanych argumentów do programu, należy użyć flagi -n. Spójrzmy na poniższy przykład, w którym w sposób jawnie wskażemy przekazanie argumentów do programu echo:
$ xargs -n 1 echo "przekazane parametry: " < wejsciowy.txt
przekazane parametry: dom
przekazane parametry: plot
przekazane parametry: drzewo
przekazane parametry: brama
przekazane parametry: pies
przekazane parametry: rzeka
przekazane parametry: las polanka

Jak widzimy, ograniczyliśmy liczbę przesyłanych argumentów do jednego. Zwróćmy szczególną uwagę na to co się stało w ostatnim przypadku. Mimo że las i polanka są rozdzielone spacją, zostały potraktowane jako jeden argument. Wszystko to za sprawą umieszczenia ich w cudzysłowie. Zatem widzimy tutaj kolejną ważną cechę xargs: aby przesłać argument zawierający odstępy, należy ująć go w cudzysłów lub apostrofy.

Co gdy każdy werset pliku ma być osobnym argumentem?

Jeśli zależy nam na przesłaniu do programu argumentów, zapisanych każdy w osobnej linijce pliku należy użyć flagi -L, która zmieni delimiter jedynie na znak nowego wiersza a przy okazji powie ile linijek ma stanowić jeden argument. Sprawdźmy to na przykładzie.
$ xargs -L 1 echo "przekazane parametry: " < wejsciowy.txt
przekazane parametry: dom plot drzewo
przekazane parametry: brama pies
przekazane parametry: rzeka
przekazane parametry: las polanka
$ xargs -L 2 echo "przekazane parametry: " < wejsciowy.txt
przekazane parametry: dom plot drzewo brama pies
przekazane parametry: rzeka las polanka

Myślę, że komentarz do powyższych wywołań jest zbędny.

Jeszcze coś może nasz zainteresować?

W mojej ocenie bardzo przydatną i ciekawą opcją polecenia xargs jest możliwość budowania argumentów na zasadzie podstawień. Od razu przejdźmy do przykładu, żeby nie rysować w powietrzu.
$ xargs -I XXX echo "przekazane parametry: (XXX)" < wejsciowy.txt
przekazane parametry: (dom plot drzewo)
przekazane parametry: (brama pies)
przekazane parametry: (rzeka)
przekazane parametry: (las polanka)

Jak widzimy, użyliśmy flagi -I, którą wskazujemy jaki ciąg znaków chcemy zastąpić wczytanymi argumentami. Dlatego też w naszym przykładzie ciąg XXX został podmieniony na parametry z pliku.

Kilka uwag na koniec

W naszych przykładach stosowaliśmy jedynie jawne i niejawne wywołania z argumentami polecenia echo, ale oczywiście może to być dowolny inny program (dobry przykład: Masowa konwersja zdjęć na systemach Linux). Na poleceniu echo, po prostu najłatwiej było pokazać pewne aspekty działania programu xargs. Zachęcam również do zapoznania się z manualem do tego polecenia, ponieważ to nie jest koniec jego możliwości. Przedstawiłem tutaj jedynie sprawy, które uznałem za najistotniejsze i najciekawsze.

Komentarze (4)

Imię:
Treść:
Administrator 2018-12-09 13:09:25
@byku, dziękuję i pozdrawiam!
byku 2018-12-08 18:43:33
super post
Administrator 2017-12-17 16:00:55
@p33k, cieszę się, że mogłem pomóc.
p33k 2017-12-16 16:21:33
ekstra post, dzięki!