Zrozumieć powłokę tekstową - troszkę historii
Po przeczytaniu wpisu kolegi roobal'a Terminal w Linux - obiekt nienawiści użytkowników systemu Windows postanowiłem napisać jeszcze coś od siebie w komentarzu, ale po chwili stwierdziłem, że mam znacznie więcej do powiedzenia. Otóż większość ludzi, których spotykałem i którym zadawałem pytanie "Czy wiesz co to powłoka systemowa?" - robiło wielkie oczy. Jak widzą jak wklepuje polecenia na "czarnym ekranie" to nie rozumieją dlaczego nie chce używać myszki. Ale żeby naprawdę zrozumieć dlaczego to robię, to należy zagłębić się nieco w historię powłok i poznać ich zalety i w ogóle dowiedzieć się co to jest. Zatem do dzieła.
Każdy komputer to zwykła kupa elektroniki, która bez odpowiedniego oprogramowania jest po prostu bezużyteczna. Dlatego też musi być wyposażony w system operacyjny, który "wie" jak obsłużyć sprzęt i jak komunikować się z człowiekiem. To pierwsze robi jądro systemu, a drugie powłoka. I na tym można skończyć, ale ja jestem nieco ambitniejszy :) i postaram się jeszcze czegoś Was drodzy Czytelnicy nauczyć.
W latach sześćdziesiątych XX wieku większość systemów operacyjnych, uruchamianych na ówczesnych komputerach, miało charakter wsadowy. Nie istniały jeszcze znane dzisiaj nośniki informacji, dlatego do wprowadzania danych do komputera używano kart perforowanych. Operator takiej maszyny najpierw musiał wczytać karty z programem, a następnie w ten sam sposób dane. Wyniki na ogół przekazywane były w formie wydruku, a następnie analizowane. Jeżeli zauważono jakieś błędy to cały proces należało powtórzyć. Nie trudno zauważyć, że procesory używane w tamtych maszynach w 95% nic nie robiły, bo przygotowanie wsadowych kart perforowanych zajmowało bardzo dużo czasu. Dlatego projektanci rozpoczęli prace nad systemem, który byłby wyposażony w interpreter umożliwiający operatorowi możliwość sterowania pracą programów poprzez wydawanie poleceń. Jednocześnie pracowano nad systemem umożliwiającym uruchamianie równolegle wielu programów przez wielu operatorów. Nie będę tutaj wdawał się w szczegóły techniczne poszczególnych systemów, napisze tylko, że pierwszym takim systemem był CTSS (ang. Cray Time Sharing System), później MULTICS (ang. Multiplexed Information and Computing Service), aż w końcu jeden z twórców MULTICS'a - Ken Thompson razem z Dennisem Ritchie napisali pierwszego UNIX’a.
I zanim o powłoce to troszkę o UNIX'e. UNIX przejął wiele cech MULTICS’a. Chodzi tu głównie o umowne reprezentowanie urządzeń plikami i wyodrębnienie interpretera poleceń, czyli celowo nie integrowano powłoki z samym systemem operacyjnym. Komputery PDP‑11, na których system UNIX miał być uruchamiany, nie były zdolne do wykonywania obszernych programów. Realizacja założonych zadań wymagała ich podziału na mniejsze jednostki zadaniowe wykonywane poprzez wywołania odpowiednich programów. Ostatecznie ograniczona przestrzeń adresowa architektury maszyn goszczących system przyczyniła się do powstania mniejszych, prostszych, ale za to bardzo wyspecjalizowanych programów. Skoro wszystko jest plikiem (a nawet to co nim nie jest - jak dodają złośliwi) to obsługa całego systemu sprowadza się do edycji plików. Należy pamiętać, że wtedy nie znano jeszcze GUI więc tworzono tysiące narzędzi tekstowych do edycji plików. Skoro tak, to z czasem powłoki systemowe wyposażono w te narzędzia. Aż wreszcie w 1977 roku niejaki Pan Stephena Bourne udostępnił własną powłokę dla systemu UNIX, którą nazwana powłoką Bourne'a, chociaż lepiej znana jest pod nazwą sh. Powłoka ta była rewolucyjnym rozwiązaniem, bo umożliwiała tworzenie i uruchamianie w niej skryptów! To bardzo istotna funkcjonalność bo wreszcie można było napisać skrypt (w języku programowania powłoki), w którym dało się automatycznie edytować tekst wykorzystując istniejące już, specjalizowane narzędzia. Ponadto użytkownik miał pełną kontrolę nad deskryptorami wejścia/wyjścia oraz przepływem danych.
Poniżej postaram się wyjaśnić jak to działa i co to nam daje za pomocą bardzo prostego polecenia.
cat tekst.txt | grep stokrotka >> nowytekst.txt
cat tekst.txt - proste polecenie wyświetlenia tekstu na ekranie. W praktyce działa to tak, że zawartość pliku tekst.txt jest kierowana na standardowy strumień wyjściowy (STDOUT), czyli na ekran. Ale można to poddać modyfikacji za pomocą operatora potoku "|". Działa to tak, że STDOUT polecenia cat jest kierowany na standardowy strumień wejściowy (STDIN) polecenia grep. (Warto zauważyć, że grep nie jest poleceniem wbudowanym w powłokę, ale zupełnie oddzielnym programem mającym własne parametry.) Ten z kolei wyszukuje w tekście słowa "stokrotka" i na STDOUT (czyli na ekran) kieruje jedynie wiersze, w których to słowo występuje. Ale tutaj napotykamy na operator przekierowania strumienia ">>", który zmienia STDOUT na plik o nazwie nowytekst.txt. Finalnie w pliku nowytekst.txt otrzymujemy tylko wiersze z pliku tekst.txt zawierające wyraz "stokrotka".
A teraz zastanówmy się nad tym ile czasu potrzebujemy żeby ten sam program napisać np. w języku C?
Po raz kolejny przypominam, że obsługa całego systemu polega na edycji plików, co możemy zrobić bezpośrednio z konsoli mając do dyspozycji tysiące narzędzi typu grep. Czyli reasumując, możemy w konsoli zrobić dosłownie wszystko! Biorąc pod uwagę fakt, że do dyspozycji mamy wiele innych powłok np. ksh, csh czy bash, które są tylko ulepszeniem powłoki sh, to otrzymujemy w pełni funkcjonalne narzędzie do administrowania systemem.
W systemach Microsoftu też są konsole tekstowe. Np. command.com dla sytemu DOS, czy cmd.exe dla systemu Windows, czy wreszcie PowerShell, za pomocą którego podobno można wykonać każde zadanie administracyjne w systemie Windows. Korzysta się z nich właśnie dlatego, że pewnie zadania można wykonać po prostu szybciej wpisując proste polecenia. Dla przykładu podam ot choćby sprawdzanie naszego adresu IP i MAC karty sieciowej w Windows. Kto z Was robi to inaczej niż uruchamiając powłokę cmd i wklepując polecenie ipconfig /all? I dlaczego nie spotkałem jeszcze nikogo, kto robi to inaczej? Ale w Windows mało kto na co dzień używa powłoki tekstowej, bo po prostu niewiele da się w niej zrobić (wyłączając PowerShell). Poza tym, Okienka są tworzone do obsługi klikanej, a polecenia tekstowe są niejako dodawane na siłę. Zupełnie inaczej jest w UNIX'ach. Tutaj niemal wszystko jest tworzone do obsługi z poziomu konsoli, a do tego dodawany jest interfejs GUI.
Podsumowując odpowiem wreszcie na pytanie "dlaczego terminal jest obiektem nienawiści użytkowników Windows". Bo w cmd.exe nie da się administrować systemem, a PowerShell jest mało znany (i według mnie nieintuicyjny). Zatem z punktu widzenia "Windowsiarza" konsola tekstowa jest po prostu zbędna. Dlatego polecam nauczyć się PowerShell i wtedy zobaczymy, czy terminal śmierdzi :).
Na zakończenie chciałbym zaproponować serię artykułów o powłoce bash i jej języku skryptowym. Tak się składa, że bash był tematem mojej pracy magisterskiej i mam sporo na jej temat do powiedzenia :)
Pozdrawiam