Powłoka systemowa (ang. shell)

Definicja i rola powłoki

Nie można pracować bezpośrednio z podstawową częścią systemu, jaką jest jego jądro. Konieczny jest do tego pośredniczący program - wiersz poleceń, inaczej powłoka, który umożliwi komunikację pomiędzy użytkownikiem a jądrem systemu, zinterpretuje i wykona wszystkie polecenia. To jądro systemu zawiera podprogramy potrzebne do operacji wejścia i wyjścia, zarządzanie plikami, a dzięki powłoce możemy z nich korzystać. Odczytuje polecenia z stdin i wypisuje na stdout. Jest odpowiedzialna za uruchamianie programów zewnętrznych. W podrozdziałach będę zajmować się powłokami teksowymi, nie graficznymi.

Powłoka używana jest w w celach:

  • interaktywnie (użytkownik pisze polecenia),
  • do dostosowania sesji do potrzeb użytkownika,
  • do programowania.

Inaczej niż w DOS-ie, powłoka jest oddzielnym programem niż system operacyjny lub jądro. Powłoki są programami ciężkimi do napisania, jednak dobrze napisana powłoka posiada wiele zalet, o jakich mogą tylko marzyć systemy z graficznym interfejsem użytkownika. Unix/linux posiada wiele różnych powłok, przystosowanych do różnych celów. Wielu programistów tworzy własne powłoki, z których wiele doczekało się szerszego grona odbiorców. Powłoki obsługują również język programowania. Kod w takim języku to skrypt powłoki. Dzięki specjalnym programom wsadowym możliwe jest łatwe zautomatyzowanie pewnych czynności.

Dla niektórych użytkowników środowiska graficzne są podstawowym sposobem porozumiewania się z systemem operacyjnym. Mimo to największa siła Linuksa kryje się poza tym interfejsem. Korzystanie z powłoki jest bardzo łatwe i daje ogromne możliwości.

Chcąc dowiedziec się o wszystkich możliwościach powłoki, wykonujemy:

% man ksh

Jak uruchomić powłokę

Aby korzystać z powłoki w środowisku graficznym konieczne jest otwarcie tak zwanego okna powłoki (shell window). Operację tę wykonują programy w rodzaju xterm, gnome-termincd, konsole lub uxterm. Każdy z nich wykonuje dokładnie tę samą operację - otwiera okno, zawierające konsolę gotową do pobierania poleceń.

Nie należy mylić programu okna powłoki z samą powłoką, działającą wewnątrz tego okna. Okno jest tylko kontenerem, a to powłoka wyświetla w nim znak zachęty i wykonuje wprowadzane polecenia. Jeżeli nie korzystamy z interfejsu graficznego (logowanie zdalnie), powłoka zostanie uruchomiona natychmiast po prawidłowym załogowaniu.

Aby zakończyć działanie powłoki, należy wpisać polecenie exit:

$ exit

Polecenia

Polecenie składa się z nazwy programu, opcji i argumentów. Nazwa programu znajduje się na dysku, jest plikiem wykonywalnym, wyszukiwanym w zmiennej środowiskowe PATH i uruchamianym przez powłokę. Opcje to opcje programu, z którymi chcemy program uruchomić. Rozpoczynają się znakiem minusa, na niektórych systemach można je pominąć zupełnie. Argumenty brane są na wejście programu.

Opcje nie są ustandaryzowane. Ta sama opcja w różnych programach może znaczyć coś innego. W programie we opcja. Argumenty również nie są ustandaryzowane. Mogą to być nazwy plików z danymi wejściowymi lub wyjściowymi, ale mogą mieć też być wyrażeniami regularnymi.

Niektóre z poleceń mogą być wykonywane tylko przez administratora systemu. Znak zachęty powłoki administratora to zazwyczaj znak: #

Niektóre programy uruchomimy tylko z linii komend, np.: MC (Midnight Commander), vim, ssh, scp (secure copy), man, wget

Można wpisywać polecenia kolejno obok siebie, wykonują się wtedy w podanej kolejnosci. Polecenia wtedy rozdzielami średnikiem.

$ echo "Listowanie zawartosci katalogu" ; ls

Następuje wtedy kolejno wykonywanie poleceń. Jeśli jedno się nie powiedzie, rezta poleceń nie zostanie wykonana.

$ echo "Listowanie zawartosci katalogu" && ls

Wykonanie pierwszego polecenia, w przypadku niepowodzenia drugiego:

$ echo "Listowanie zawartosci katalogu" || ls

Polecenie może wywołać jakiś program, ale może też być funkcją wykonywaną przez samą powłokę. Jak rozróżnić te dwie rzeczy? Używamy polecenia type w następujący sposób:

type

Jak się dowiedzieć z jakiego shella korzystamy?

$ which $SHELL
/bin/bash

Do jakich powłok możemy mieć dostep?

$ cat /etc/shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen
/bin/ksh93
/bin/zsh
/usr/bin/zsh

Zmiana powłoki poleceniem chsh oraz okazjonalne użycie innej powłoki niż domyślna poleceniem exec lub wpisująć samą nazwę powłoki.

$ exec csh lub /bin/csh
$ chsh csh

Przykłady powłok:

  • GRUB (bootloader),
  • GDB (GNU Debugger) napisany w 1988 r. przez Richarda Stallmana. Program obsługuje wiele architektur komputerowych i jest dostępny dla wielu systemów operacyjnych,
  • powłoki systemowe, i to o nich traktuje ta praca.

Kontrola zadań

Powłoki posiadają mechanizm kontroli zadań, czyli możliwość uruchamiania programów w tle, poz potrzeby uruchamiania kolejnych okien terminala. Powłoka uruchamiane programy traktuje jako zadania. Ogólnie stwierdzamy, że to system zajmuje się zadaniami, ale konkretnie to powłoki kontrolują zadania.

Zasady:

& - uruchamia zadanie w tle.
ctr + z - wstrzymuje działanie aktualnego zadania.
fg - wznowienie zadania i przeniesienie go na pierwszy plan, foreground.
bg - sprawia, że wstrzymane zadanie wznawia pracę w tle, background.

  • Zadanie piewszoplanowe zajmuje powłokę tak, że nie można wydać kolejnych poleceń. Tylko jedna aplikacja może działać na pierwszym planie,
  • Zadanie w tle nie zajmuje powłoki i można wydać w niej inne poleceń,
  • Zawieszenie wstrzymanie działania zadania pierwszoplanowego,
  • Wyróżniamy również wznowienie zadania wstrzymanego.

Możemy wyedytować plik w vimie, wcisnąć ctrl + z wstrzymując to zadanie, następnie otworzyć podręcznik i znów zatrzymać zadanie. Polecenie:

$ jobs

wypisze listę zadań działających aktualnie w powłoce.

jobs

Liczba całkowita z lewej strony to numer zadania, znak '+' oznacza zadanie, na które wpływ będą miały polecenia fg i bg. '&' na końcu wiersza polecenia powoduje, że polecenie zostanie uruchomione jako zadanie w tle.

bg

Polecenie bg odsyła wstrzymane zadanie do pracy w tle. Wpisane bez żadnych argumentów polecenie bg uruchomi ostatnio wstrzyme zadanie. Uruchamianie konkretnego polecenia, np:

$ bg %2

Wznowienie zadania poleceniem fg (i tym samym uruchomienie go na pierwszym planie), np:

$ fg %1

Charakterystyka poszczególnych powłok

Użyteczność (ang. usability) to nauka zajmująca się określaniem interaktywnych urządzeń i aplikacji pod względem przyjazności w użyciu. Skupia się na intuicyjnym poruszaniu się po aplikacjach (najlepiej zrozumiałym dla uzytkownika) oraz łatwym dostępie do poszukiwanych informacji. Produkt, program powinien dostarczaś użytkownikowi pozytywnych doświadczeń.

Powłoki systemów operacyjnych poddawane są przez wielu użytkowników testom na przyjazność - zdania są jednak podzielone i ostatecznie każdy samodzienie wybiera powłokę najlepiej pasującą do zadań wykonywanych codziennie na komputerze.

Najbardziej znanymi i najczęściej wykorzystywanymi powłokami systemowymi są:

  • sh - Bourne shell

    /bin/sh
    to najstarsza powłoka ze wszystkich uniksowych. Powłoka ta niestety nie oferuje zbyt wielu działań, których można wymagać od powłoki, takich choćby jak edycja wiersza poleceń. Na początku był to jedyny wybór. Stworzona została przez Stephena Bourne'a w Laboratorium Bell przez rozbudowanie prostego interpretera poleceń o nazwie shell. Do skryptów nadal jednak jest polecany ze względu na przenośność skryptów na systemy gdzie nie ma ani zsh ani bash. Najlżejsza (najmniej obsługuje też).
  • Rsh - Restricted Bourne Shell­

    /bin/rsh
    Jest jedną z odmian powłoki Bourne'a. Litera R w jej nazwie odnosi się do słowa Restricted, czyli Ograniczona. Powłoka ta udostępnia okrojone funkcje powłoki sh. stosowana do tworzenia środowiska użytkowego o ograniczonych możliwościach i prawach dostępu. Jest ona szczególnie przydatna dla użytkowników o niewielkich umiejętnościach i znajomości Unix'a np. wykonujących prace biurowe.
  • ibsh - Iron Bars Shell

    /bin/irbsh
    Jest to projekt restrykcyjnej powłoki, tworzonej z myślą o bezpieczeństwie. Jedną z głównych idei projektu jest zakazanie wszystkich operacji, które nie zostały jawnie określone jako dozwolone. Powłoka oferuje też kilka ciekawych funkcji, jak kontrola parametrów wykonywanych poleceń, logowanie poczynań użytkownika do sysloga czy też blokowanie dostępu do plików, których rozszerzenie nie znajduje się na liście dozwolonych rozszerzeń utworzonej przez administratora (ustawienie blokady na pliki *.c, zapobiegnie kompilacji potencjalnie szkodliwych źródeł C itp.). W ten sposób zyskujemy dużo większą kontrolę nad poczynaniami użytkownika . Standardowo ibsh jest bardzo restrykcyjne ustawione, możliwe są do wykonania tylko następujące komendy : cd, pwd, logout, exit. Aby to zmienić edytujemy plik z dozwolonymi komendami : /etc/ibsh/globals.cmds
  • csh - C shell

    /bin/csh
    Jest jedną z systemowych powłok uniksowych. Została stworzona przez Billa Joy'a dla systemu BSD. Nazwa C shell jest grą słów: sea shell, czyli muszelka. Powłoka ta pochodzi od /bin/sh, poprzednika powłoki sh. Składnia języka zastosowanego w powłoce bazuje na języku C. Jest ona szczególnie używana przez programistów Uniksa. Powłoka C shell wniosła wiele ulepszeń w stosunku do sh, takich jak m.in. aliasy i historia komend. Obecnie csh nie jest zbyt często wykorzystywana; zamiast niej w użyciu są takie powłoki jak tcsh, Korn shell (ksh), oraz GNU bash. Jej następcą jest z kolei tcsh.
  • tcsh, Tenex shell

    /bin/tcsh
    Rozbudowana wersja C shell, kompatybilna z csh, druga, popularna w uniksach , następca csh. Oferuje dodatkowe możliwości realizacji poleceń i nazw plików oraz niektórych funkcji edycji wiersza poleceń. Litera T w nazwie pochodzi od systemu operacyjnego TENEX. csh z dodatkowymi funkcjami - np. dopełnianie komend Domyślna powłoka w systemach FreeBSD i we wczesnych wersjach Mac OS
  • ksh - Korn Shell

    /bin/ksh
    Popularna w uniksach, rzadko w linuksach (domyslnie w PLD, popularnym polskim linuksie) . Została stworzona przez Davida Korna z AT&T Bell Laboratories w połowie lat osiemdziesiątych. Powłoka ksh jest całkowicie kompatybilna wstecz z powłoką sh, zawiera także wiele elementów z powłoki csh - takich jak historia wpisanych komend. ksh zawiera wbudowany system obliczania wyrażeń arytmetycznych oraz zaawansowane funkcje skryptów podobne do tych używanych w bardziej zaawansowanych językach programowania, takich jak awk, sed, i perl. Powstała w 1983 roku, a jej publikacja odbyła się w 1986 roku. Stanowi ona rozszerzenie powłoki Bourne'a.
  • rksh - Restricted Korn Shell

    /bin/rksh
    Ograniczona powłoka Korna, podobnie jak rsh
  • pdksh - Public Domain Korn Shell

    interpreter Korn Shell, którego autorem jest David Korn, jest trzecią z powłok używanych najczęściej w systemach UNIX-owych. Został napisany później niż powłoki sh i csh, dzięki czemu łączy w sobie ich zalety. Nie jest jednak rozprowadzany razem z systemami UNIX-owymi, więc wiele osób po prostu nie miało okazji go poznać. Implementuje udogodnienia wprowadzone przez powłokę csh, a jednocześnie pozostaje całkowicie dostępna za darmo. Pdksh wzoruje się na ksh. Standardowy "ksh" miał zbyt restryktywną licencję, więc powstał pdksh. Shell ten oferuje bardzo dobrze zrealizowaną pracę w trybie zgodności z /bin/sh, oprócz tego też stara się jak najlepiej emulować ksh (choć to drugie raczej niewielu interesuje). Shell nadaje się świetnie do uruchamiania skryptów, można go też używać w normalnej, interaktywnej pracy, choć nie oferuje on tutaj zbyt wiele. Jego główną zaletą jest wysoka zgodność z /bin/sh i znakomite osiągi przy interpretowaniu skryptów (radzi sobie tutaj chyba najlepiej z wszystkich (linuksowych shelli). A więc idealny wybór na /bin/sh.
  • bash - Bourne Again sh

    /bin/bash
    Ponowiona powłoka Bourne'a. bardzo popularna, autor: Brian Fox. Jest domyślną powłoką niektórych dystrybucjach Unix'a a także Linux'a. Została stworzona oraz rozpowszechniona prze organizację GNU. Dobrze jest poznać tę powłokę ma możliwość edycji wiersza poleceń oraz realizacji nazw plików. Powłoka bash umożliwia pracę interaktywną i wsadową. Język Basha umożliwia definiowanie aliasów, funkcji, zawiera konstrukcje sterujące przepływem (if, while, for, ...). Łączy rozwiązania z ksh i csh . Powłoka bash zachowuje historię wykonywanych poleceń. Jest ona zapisywana w pliku .bash_history w katalogu domowym użytkownika. Kompatybilna z sh. Ubogia w obliczeniach arytmetycznych.
  • ash - A Shell - Almquist shell

    /bin/ash
    Ash i sh w początkowej fazie był stworzonym przez Kennetha Almquista. Jest szybka, mała, kompatybilny sh. W oryginalnej wersji nie posiadał możliwości edycji linii oraz mechanizmu historii poleceń ponieważ Almquist uważał, że takie możliwości powinny znajdować się w driverach terminala. Jednak obecne wersje wspierają te możliwości. Pochodne wersje ash są instalowane jako domyśłny shell (/bin/sh) na FreeBSD, NetBSD, DrangonFly BSD i Minix. ash jest także dosyć popularny na wbudowanych systemach Linuxa (embedded). Wersja na Debiana jest znana jako Debian Almquist Shell (dash). Niektóre dystrybucje linuksa także używają pochodnych ash jako domyślnej powłoki, chociaż bash jest bardziej popularny. Np. w Ubuntu występuje symlink /bin/sh prowadzący do powłoki dash w celu szybszej egzekucji skryptów, ale dodatkowo Bash shell jest domyślną powłoką przy logowaniu. Dobra dla maszyn z małą ilością pamięci, lecz nie udostępnia takich możliwości jak bash, tcsh czy zsh. Pozwala na uruchomienie większości skryptów kompatybilnych z powłoką sh.
  • fish - Fish shell - Friendly interactive shell

    /bin/fish
    Przyjazna powłoka interaktywna. Na licencji GPL. Bazuje na tych samych ideach jak inne powłoki Uniksowe (bash, zsh) ale wprowadza wiele usprawnień w interfejsie użytkownika i skryptach powłoki. Zawiera wiele ciekawych rozwiązań, poprawek do starych problemów i jest przemyślanie zaprojektowana. Od początku była projektowana i poprawiana poprzez długi proces prób i modyfikacji. Składnia języka skryptowego fish została zaprojektowana w taki sposób że zamiast wielu podobnych rozwiązań, starano się zapewnić jedno o dużo większych możliwościach. Fish zawiera wiele usprawnień w interfejsie użytkownika: podświetlanie składni, uzupełnianie klawiszem TAB wszystkiego, kolorowanie instrukcji sterujących if/for/case podczas klepania ich w terminalu, czy podświetlanie nazw poleceń i wielu innych rzeczy. fish robi to wszystko domyślnie.
  • Zsh - Z shell

    /bin/zsh
    Jest to najnowsza powłoka, kompatybilna z powłoką sh , ostatnio bardzo zachwalana. Uniksowa powłoka (ang. shell) nadająca się zarówno do interaktywnej pracy z systemem jak i do wykonywania skryptów. Spośród standardowych powłok zsh najbardziej przypomina Korn shell, ale zawiera wiele ulepszeń. Zsh posiada edycję wiersza poleceń, wbudowaną korekcję pisowni, programowalne dopełnianie poleceń, funkcje (z automatycznym ładowaniem), historię poleceń i mnóstwo innych cech. Pierwotnie zsh został napisany przez Paula Falstada. Obecnie zsh jest utrzymywany przez członków listy dyskusyjnej zsh-workers. Koordynatorem projektu jest obecnie Andrew Main (Zefram). Najlepsza ze względu na najlepsze dopełnienia. Lekka. Dobra do obliczeń arytmetycznych w skryptach, ma rozszerzoną obsługę arytmetyki.
  • COMMAND.COM

    To domyślna powłoka systemu MS-DOS i niektórych wersji systemu Windows. Tłumaczy polecenia wpisane po znaku zachęty (zwykle "C:\>" bądź "C>") na komendy wykonywalne przez system DOS. command.com jest również plikiem wykonywalnym. Interpretuje on ciąg znaków z klawiatury, sprawdzając czy jest to komenda wewnętrzna, czy polecenie uruchomienia programu (np. pliki *.COM). Pliki polecenia programu zewnętrznego są wyszukiwane zmiennej środowiskowej opisanej w pliku autoexec.bat. Gdy polecenie nie zostanie rozpoznane, wyświetlony zostanie stosowny komunikat.
    Command może pracować w dwóch trybach – aktywnym (interakcyjnym) lub wsadowym. Tryb wsadowy polega na zinterpretowaniu pliku wsadowego BAT, (skryptu polecen MS-DOS). Plik autoexec.bat jest przykładem pliku wsadowego.
    Występuje do Windows Milenium, od Windows XP już nie.
  • cmd.exe

    Interpreter poleceń stosowany w rodzinie systemów operacyjnych Microsoft Windows NT (od Windows 2000) oraz Windows CE, OS/2. Jego położenie jest zapisane w zmiennej środowiskowej ComSpec. Okno konsoli otwieram się poleceniem: cmd. W już otwartym oknie konsoli uruchamia się wtórny procesor poleceń, który dziedziczyć środowisko po pierwotnym procesorze.
  • Windows PowerShell

    Poprzednio Microsoft Shell lub MSH, interpreter poleceń firmy Microsoft. To rozbudowany następca dotychczasowych interpreterów (command.com, cmd.exe). Został wydany w 2006 r. i jest dostępny dla Windows XP SP2, Windows 2003, Windows Vista, Microsoft Windows Server 2008. PowerShell jest zintegrowany z .NET Framework. Charakterystyczną cechą PowerShell jest obiektowa logika. Wynikiem każdego polecenia nie jest ciąg znaków na ekranie, ale obiekt określonego typu.

Zmienne środowiskowe

Służą do przekazywania informacji powłoce oraz programom uruchamianym w powłoce. Ich nazwy składają się z wielkich liter, to ich cecha charakterystyczna. $ - znak specjalny, oznacza wartość zmiennej. Zmienne środowiskowe często zawierają informacje o ścieżkach do katalogów (np. HOME) i plików (np. potrzebnych programom). Jeśli definiowane są w plikach konfiguracyjnych sesji użytkownika, są z góry ustawionymi zmiennymi dla wszystkich użytkowników, bądź też wybranych.

Sprawdzanie zawartości zmiennej środowiskowej:

echo $HOME
echo $SHELL
echo $PATH
echo $LOGNAME

Wyświettanie wszystkich ustawionych zmiennych środowiskowych:

$ set

lub

$ env

Możemy zmieniać ich wartości z wiersza poleceń, tymczasowo - będą aktywne aż do końca pracy w powłoce. Aby jej wartość została zapamiętana przy następnym uruchomieniu powłoki, należy ją zdefiniować w pliku konfiguracyjnym (np. profilowym .bashrc, .shrc).

tcsh - setenv IMIE Natka
bash - export IMIE=Natka

Pliki *profile powłok powinny zawierać wyłącznie zmienne środowiskowe oraz programy uruchamiane przy inicjowaniu sesji pracy z terminalem.