Trudno cokolwiek zrobić na komputerze bez możliwości uruchamiania programów. Oczywiście zawsze można użyć komputera w charakterze podpórki do czegoś bądź też przytrzymać nim drzwi tak, by się nie otwierały, niektórzy też włączą komputer tylko i wyłącznie by posłuchać delikatnego szumu pracującej maszyny - ale to wszystko do czego zdolny jest komputer bez programów. I wszyscy zgodzimy się z tym, iż bycie szumiącą podstawką pod drzwi to nie jest to, co przyniosło komputerom osobistym popularność, którą dziś się cieszą.
Pamiętasz jak wspominaliśmy o tym, iż w Linuksie praktycznie wszystko jest przedstawiane pod postacią plików? Ta sama zasada obowiązuje programy. Każde polecenie, które wykonasz (a które nie jest wbudowane w powłokę), urzęduje gdzieś na dysku w postaci pliku. Programy uruchamia się podając ścieżkę dostępu do nich.
Dla przykładu przypomnij sobie polecenie su przedstawione w poprzednim rozdziale. Program ten znajduje się w katalogu /bin; uruchomi go wpisanie /bin/su.
Dlaczego więc działa wpisanie tylko su? Przecież nigdzie nie podajemy, że program ten jest w katalogu /bin. Równie dobrze mógłby znajdować się on chociażby w /usr/local/share, czyż nie? W jaki sposób powłoka wie, gdzie szukać? Odpowiedzią na to pytanie jest istnienie zmiennej środowiskowej PATH (z ang. ścieżka); większość powłok posiada albo taką właśnie zmienną, albo coś pełniącego jej rolę. W ogólności zmienna PATH zawiera listę katalogów przeglądanych w poszukiwaniu programów, których uruchomienia żądasz. Tak więc, kiedy wydajesz komendę su, twoja powłoka przegląda kolejne katalogi szukając programu o nazwie su. Uruchamiany jest pierwszy znaleziony. Tak dzieje się zawsze, gdy wydasz komendę nie podawszy pełnej ścieżki dostępu. Jeżeli otrzymasz komunikat ““Command not found”” (z ang. 'polecenie nie znalezione') to znaczy, że pożądany program, znajduje się w katalogu nie wymienionym w zmiennej PATH (bądź też w ogóle nie istnieje na dysku...). PATH jest jedną z wielu zmiennych środowiskowych. Zmiennym tym bliżej przyjrzymy się w Sekcja 8.3.1.
I na koniec jeszcze jedna uwaga: “.” jest skrótowym określeniem bieżącego katalogu. Oznacza to, iż np. gdy jesteś wewnątrz /bin, to wpisanie ./su będzie miało dokładnie ten sam skutek, co podanie pełnej ścieżki dostępu, czyli /bin/su.
Praktycznie każda powłoka rozpoznaje pewne znaki jako podstawienia albo skróty zastępujące dowolne ciągi znaków. Są to tzw. znaki uniwersalne (z ang. “wildcards”; w polskiej literaturze często tłumaczone jako “znaki globalne”). Dwa najbardziej znane to * oraz ?. Tradycyjnie, znak ? służy do zastępowania dowolnego innego znaku. Dla przykładu: załóżmy, iż mamy katalog z trzema plikami: ex1.txt, ex2.txt oraz ex3.txt i chcemy przekopiować (używając polecenia cp, poznanego w Sekcja 10.5.1) całą trójkę do katalogu, powiedzmy /tmp. Tak więc cierpliwie w linii poleceń wpisujemy cp ex1.txt ex2.txt ex3.txt /tmp... ale to dużo roboty. O wiele łatwiej jest napisać cp ex?.txt /tmp; znak uniwersalny ? stanowi dopasowanie do występujących w nazwach plików znaków “1”, “2” oraz “3” i podczas tego kopiowania będzie zastąpiony właśnie nimi.
Twierdzisz, że i to ciągle zbyt długo? Masz rację. To okropne; przecież mamy prawo pracy chroniące nas przed takimi rzeczami. Na szczęście, mamy też możliwość używania drugiego znaku specjalnego, czyli *. Jak wspomniano, * zastępuje “dowolny ciąg znaków” (wliczając w to także brak znaków). Tak więc, jeżeli wspomniane chwilę temu trzy pliki są jedynymi w tym katalogu, to możemy po prostu napisać cp * /tmp i w ten sposób jednym rzutem skopiujemy całą trójkę. Przypuśćmy teraz, iż w danym katalogu znajdują się jeszcze dwa pliki, pierwszy o nazwie ex.txt oraz drugi, hejaz.txt. Razem z wcześniej wspomnianą trójką chcemy jeszcze skopiować plik ex.txt, nie chcemy jednak kopiować hejaz.txt; cp ex* /tmp wykona nasze żądanie.
cp ex?.txt /tmp skopiuje oczywiście trzy znane nam już pliki; w nazwie ex.txt nie ma znaku, który mógłby być zastąpiony przez ?, tak więc plik ten zostanie pominięty...
Następne powszechnie używane znaki specjalne to para nawiasów kwadratowych: [ ]. Wszystkie znaki umieszczone wewnątrz nich będą kolejno podstawione, by znaleźć pasujące do wzorca dopasowania. Brzmi niezrozumiale? Spokojna głowa, już wyjaśniamy na przykładzie. Przypuśćmy, że mamy katalog zawierający 8 plików: a1, a2, a3, a4, aA, aB, aC, oraz aD i chcemy spośród nich wybrać tylko te kończące się cyframi; [ ] zrobią to dla nas.
% ls a[1-4] a1 a2 a3 a4 |
W powyższym przykładzie zażądaliśmy dopasowania wszystkich wartości pomiędzy 1 a 4. Gdy będziemy chcieli wyświetlić np. a1, a2 oraz a4 to żądane wartości oddzielmy przecinkami:
% ls a[1,2,4] a1 a2 a4 |
OK, z cyframi problemów nie ma; nasuwa się pytanie “Dobra, a co z literami?” Linux jest wrażliwy na wielkość znaków (z ang. case-sensitive). Oznacza to, iż a oraz A to dwa całkiem różne znaki, powiązane ze sobą jedynie w twoim umyśle. Duże litery zawsze występują przed małymi, tak więc A oraz B znajdują się przed a oraz b. Kontynuując poprzedni przykład, jeżeli chcemy wylistować pliki a1 oraz A1, wystarczy odpowiednio użyć nawiasów [ ]:
% ls [A,a]1 A1 a1 |
Uważaj, by nie pomylić łącznika “-” z przecinkiem, gdyż możesz otrzymać wynik inny od zamierzonego:
% ls [A-a]1 A1 B1 C1 D1 a1 |
Oczywiście można też używać łączników i przecinków w sposób kombinowany:
% ls [A,a-d] A1 a1 b1 c1 d1 |
Tu zaczyna się coś naprawdę świetnego!
% ps > blargh |
Widziałeś kiedyś coś takiego? Wiesz, co to znaczy? To ja, uruchamiam sobie ps by wyświetlić listę procesów uruchomionych w systemie (polecenie ps zostało opisane w Sekcja 11.3). Ale to przecież nic specjalnego. Gwoździem programu jest przekierowanie (z ang. “redirection”) > blargh, mówiące powłoce “weź wyjście z ps i zapisz je do pliku blargh”. Proste i przydatne, prawda? Ale przygotuj się, przed nami jeszcze ciekawsze rzeczy.
% ps | less |
Powyższe kieruje strumień wyjściowy (ang. “piping”) programu ps na wejście programu less, dzięki czemu mogę je sobie przejrzeć bez pośpiechu.
% ps >> blargh |
Oto trzeci powszechnie znany i używany rodzaj przekierowania; robi dokładnie to samo, co “>”, z tą drobną różnicą, że “>>” dopisze wyjście ps do pliku blargh, jeżeli plik istnieje. Jeżeli nie - zostanie tak jak przy użyciu “>” utworzony. (Użycie “>” gdy plik blargh istnieje, spowoduje nadpisanie jego zawartości.)
Jest też jeszcze operator “<”, który oznacza “pobierz na wejście to, co stoi za operatorem” - ale nie jest on już tak często używany.
% fromdos < dosfile.txt > unixfile.txt |
Przekierowywanie staje się naprawdę zabawne, kiedy zaczynasz mieszać różne warianty:
% ps | tac >> blargh |
Taki ciąg poleceń uruchomi ps, odwróci kolejność linii na jego wyjściu oraz dopisze je w tak zmienionej kolejności do pliku blargh. Możesz wymieszać przekierowania w takiej ilości jak tylko chcesz; jednakże nie zapominaj, iż zawsze są one interpretowane od lewej do prawej.
Przeczytaj strony manuala dla bash(1) by dowiedzieć się więcej na temat przekierowań.