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
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"
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.przekazane parametry: dom plot drzewo
przekazane parametry: brama pies
przekazane parametry: rzeka
przekazane parametry: las polanka
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.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.

Komentarze (4)