Ważną częścią nauki pracy z Ubuntu, i dystrybucji Linuksa w ogóle, obejmuje uzyskanie biegłości w pracy w środowisku powłoki. Podczas gdy środowiska graficzne takie jak GNOME dołączone do Linuksa zapewniają przyjazny dla użytkownika interfejs systemu operacyjnego, w praktyce środowisko powłoki zapewnia znacznie większe możliwości, elastyczność i automatyzację niż kiedykolwiek można osiągnąć używając narzędzi graficznych. Środowisko powłoki dostarcza również środków do interakcji z systemem operacyjnym, gdy środowisko pulpitu nie jest dostępne; jest to częste zjawisko podczas pracy z systemem operacyjnym opartym na serwerze, takim jak Ubuntu lub uszkodzonym systemem, który nie chce się w pełni uruchomić.

Celem tego rozdziału jest zatem przedstawienie przeglądu domyślnego środowiska powłoki w Ubuntu (konkretnie powłoki Bash).

1.1 Co to jest powłoka?

Powłoka jest interaktywnym środowiskiem interpretera poleceń, w którym polecenia mogą być wpisywane na znak zachęty lub wprowadzane do pliku w formie skryptu i wykonywane. Początki powłoki można prześledzić do wczesnych dni systemu operacyjnego UNIX. W rzeczywistości, we wczesnych dniach Linuksa, przed wprowadzeniem graficznych pulpitów, powłoka była jedynym sposobem interakcji użytkownika z systemem operacyjnym.

Różne środowiska powłoki były rozwijane przez lata. Pierwszą szeroko używaną powłoką była powłoka Bourne’a, napisana przez Stephena Bourne’a w Bell Labs.

Innym wczesnym tworem była powłoka C, która dzieliła pewne podobieństwa składniowe z językiem programowania C i wprowadziła ulepszenia użyteczności, takie jak edycja wiersza poleceń i historia.

Powłoka Korna (opracowana przez Davida Korna w Bell Labs) jest oparta na cechach dostarczonych zarówno przez powłokę Bourne’a jak i powłokę C.

Domyślną powłoką w Ubuntu jest powłoka Bash (skrót od Bourne Again SHell). Powłoka ta, która rozpoczęła życie jako open source’owa wersja powłoki Bourne’a, została stworzona dla Projektu GNU przez Briana Foxa i opiera się na funkcjach dostarczanych zarówno przez powłokę Bourne’a jak i powłokę C.

1.2 Uzyskanie dostępu do powłoki

W środowisku GNOME, zachęta powłoki może być dostępna z okna Terminala poprzez wybranie opcji Działania na górnym pasku, wpisanie Terminala w pasku wyszukiwania i kliknięcie ikony Terminala.

Podczas zdalnego logowania się do serwera Ubuntu, na przykład przy użyciu SSH, użytkownik jest również prezentowany z zachętą powłoki. Szczegóły dotyczące dostępu do zdalnego serwera za pomocą SSH zostaną omówione w rozdziale zatytułowanym „Konfiguracja uwierzytelniania opartego na kluczach SSH w Ubuntu”. Podczas uruchamiania systemu opartego na serwerze, w którym środowisko graficzne nie zostało zainstalowane, powłoka jest uruchamiana natychmiast po zakończeniu przez użytkownika procedury logowania na terminalu konsoli fizycznej lub zdalnej sesji logowania.

1.3 Wprowadzanie poleceń w znaku zachęty

Polecenia są wprowadzane w znaku zachęty poleceń powłoki po prostu przez wpisanie polecenia i naciśnięcie klawisza Enter. Podczas gdy niektóre polecenia wykonują zadania bezgłośnie, większość z nich wyświetli jakąś formę informacji wyjściowej przed powrotem do znaku zachęty. Na przykład, polecenie ls może być użyte do wyświetlenia plików i katalogów w bieżącym katalogu roboczym:

$ ls

Desktop Dokumenty Pobieranie Muzyka Obrazy Szablony publiczne Filmy wideo

Dostępne polecenia są albo wbudowane w samą powłokę, albo rezydują na fizycznym systemie plików. Lokalizacja polecenia w systemie plików może być określona przy pomocy polecenia which. Na przykład, aby dowiedzieć się, gdzie w systemie plików rezyduje polecenie wykonywalne ls:

$ which ls alias ls='ls --color=auto' /usr/bin/ls

Wyraźnie polecenie ls rezyduje w katalogu /usr/bin. Zauważ również, że skonfigurowany jest alias, temat, który zostanie omówiony w dalszej części tego rozdziału. Użycie polecenia which do zlokalizowania ścieżki do poleceń wbudowanych w powłokę spowoduje wyświetlenie komunikatu wskazującego, że nie można znaleźć pliku wykonywalnego. Na przykład, próba znalezienia lokalizacji polecenia history (które jest w istocie wbudowane w powłokę, a nie istnieje jako plik wykonywalny w systemie plików) da wynik podobny do poniższego:

$ which history/usr/bin/which: no history in (/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)

1.4 Uzyskiwanie informacji o poleceniu

Wiele poleceń dostępnych dla powłoki Linuksa może wydawać się na początku tajemnicze. Aby znaleźć szczegółowe informacje o tym, co robi dane polecenie i jak go używać, należy użyć polecenia man, podając nazwę polecenia jako argument. Na przykład, aby dowiedzieć się więcej o poleceniu pwd:

$ man pwd

Po wykonaniu powyższego polecenia zostanie wyświetlony szczegółowy opis polecenia pwd. Wiele poleceń dostarczy również dodatkowych informacji, gdy zostanie uruchomionych z opcją wiersza poleceń -help:

$ wc --help

1.5 Edycja wiersza poleceń Bash

Wcześniejsze środowiska powłoki nie zapewniały żadnej formy możliwości edycji wiersza. Oznaczało to, że jeśli zauważyłeś błąd na początku długiego wiersza poleceń, który wpisywałeś, musiałeś usunąć wszystkie następne znaki, poprawić błąd i ponownie wpisać resztę polecenia. Na szczęście Bash udostępnia szeroki zakres opcji edycji wiersza poleceń, jak pokazano w poniższej tabeli:

Sekwencja klawiszy Akcja
Ctrl-b lub Strzałka w lewo Przesuń kursor do tyłu o jedną pozycję
Ctrl-.f lub Strzałka w prawo Przesuń kursor do przodu o jedną pozycję
Delete Usuń znak znajdujący się aktualnie pod kursorem
Backspace Usuń znak na lewo od kursora
Ctrl-_ Cofnięcie poprzedniej zmiany (można powtórzyć, aby cofnąć wszystkie poprzednie zmiany)
Ctrl-.a Przesunięcie kursora na początek wiersza
Ctrl-e Przesunięcie kursora na koniec wiersza
Meta->.f lub Esc następnie f Przesunięcie kursora o jedno słowo do przodu
Meta-b lub Esc następnie b Przesunięcie kursora o jedno słowo do tyłu
Ctrl-l Wyczyść ekran z wszystkiego oprócz bieżącego polecenia
Ctrl-k Deletuj do końca wiersza od bieżącej pozycji kursora
Meta->.d lub Esc następnie d Usuń do końca bieżącego słowa
Meta-DEL lub Esc następnie DEL Usuń początek bieżącego słowa
Ctrl-w Usuń od bieżącej pozycji kursora do poprzedniej białej spacji

Tabela 9-1

1.6 Praca z powłoką Historia

Oprócz funkcji edycji wiersza poleceń, powłoka Bash zapewnia również obsługę historii wiersza poleceń. Listę poprzednio wykonanych poleceń można przejrzeć za pomocą polecenia historia:

$ history1ps2ls3ls –l /4ls5man pwd6man apropos

Dodatkowo, można użyć Ctrl-p (lub strzałki w górę) i Ctrl-n (lub strzałki w dół) do przewijania w przód i w tył poprzednio wprowadzonych poleceń. Gdy wyświetlane jest żądane polecenie z historii, naciśnij klawisz Enter, by je wykonać.

Inną opcją jest wprowadzenie znaku ’!’, po którym następuje kilka pierwszych znaków polecenia do powtórzenia, a następnie klawisz Enter.

1.7 Skróty nazw plików

Wiele poleceń powłoki przyjmuje jedną lub więcej nazw plików jako argumenty. Na przykład, aby wyświetlić zawartość pliku tekstowego o nazwie list.txt, polecenie cat byłoby użyte w następujący sposób:

$ cat list.txt

Podobnie, zawartość wielu plików tekstowych może być wyświetlona przez podanie wszystkich nazw plików jako argumentów:

$ cat list.txt list2.txt list3.txt list4.txt

Zamiast wpisywania każdej nazwy, można użyć dopasowywania wzorca, aby określić wszystkie pliki o nazwach spełniających pewne kryteria. Na przykład, znak wieloznaczny '*’ może być użyty do uproszczenia powyższego przykładu:

$ cat *.txt

Powyższe polecenie wyświetli zawartość wszystkich plików kończących się rozszerzeniem .txt. Można to dalej ograniczyć do nazw plików zaczynających się od list i kończących się na .txt:

$ cat list*.txt

Dopasowania pojedynczych znaków można określić przy użyciu znaku ’?’:

$ cat list?.txt

1.8 Uzupełnianie nazw plików i ścieżek

Zamiast wpisywać całą nazwę pliku lub ścieżkę dostępu, czy też używać dopasowywania wzorców w celu zmniejszenia ilości wpisywania, powłoka udostępnia funkcję uzupełniania nazw plików. Aby skorzystać z uzupełniania nazw plików, wystarczy wprowadzić kilka pierwszych znaków nazwy pliku lub ścieżki, a następnie dwukrotnie nacisnąć klawisz Esc. Powłoka uzupełni wówczas nazwę pliku o pierwszy plik lub nazwę ścieżki w katalogu, który pasuje do wprowadzonych znaków. Aby uzyskać listę możliwych dopasowań, naciśnij Esc = po wprowadzeniu kilku pierwszych znaków.

1.9 Przekierowanie wejścia i wyjścia

Jak już wspomniano, wiele poleceń powłoki wypisuje informacje podczas wykonywania. Domyślnie, wyjście to trafia do pliku urządzenia o nazwie stdout, który jest zasadniczo oknem terminala lub konsolą, w której działa powłoka. I odwrotnie, powłoka pobiera dane wejściowe z pliku urządzenia o nazwie stdin, którym domyślnie jest klawiatura.

Wyjście z polecenia może być przekierowane ze stdout do fizycznego pliku w systemie plików przy użyciu znaku ’>’. Na przykład, aby przekierować wyjście z polecenia ls do pliku o nazwie files.txt, należy wykonać następujące polecenie:

$ ls *.txt > files.txt

Po wykonaniu polecenia, plik files.txt będzie zawierał listę plików w bieżącym katalogu. Podobnie, zawartość pliku może być podawana do polecenia zamiast stdin. Na przykład, aby przekierować zawartość pliku jako wejście do polecenia:

$ wc –l < files.txt

Powyższe polecenie wyświetli liczbę linii zawartych w pliku files.txt.

Ważne jest, aby zauważyć, że operator przekierowania ’>’ tworzy nowy plik lub obcina istniejący, gdy jest używany. W celu dołączenia do istniejącego pliku, użyj operatora ’>>’:

$ ls *.dat >> files.txt

Oprócz standardowego wyjścia, powłoka zapewnia również standardowe wyjście błędów, używając stderr. Podczas gdy wyjście z polecenia kierowane jest na stdout, wszelkie komunikaty o błędach generowane przez polecenie kierowane są na stderr. Oznacza to, że jeśli stdout kierowane jest do pliku, to komunikaty o błędach nadal będą się pojawiać w terminalu. Jest to ogólnie pożądane zachowanie, choć stderr może być również przekierowany jeśli jest to pożądane przy użyciu operatora '2>’:

$ ls dkjfnvkjdnf 2> errormsg

Po zakończeniu polecenia, w pliku errormsg znajdzie się błąd informujący o tym, że plik o nazwie dkjfnvkjdnf nie mógł zostać znaleziony.

Oba stderr i stdout mogą być przekierowane do tego samego pliku przy użyciu operatora &>:

$ ls /etc dkjfnvkjdnf &amp;&gt; alloutput

Po zakończeniu wykonywania polecenia, plik alloutput będzie zawierał zarówno listing zawartości katalogu /etc, jak i komunikat o błędzie związanym z próbą listingu nieistniejącego pliku.

1.10 Praca z potokami w powłoce Bash

Oprócz przekierowywania operacji wejścia/wyjścia, powłoka pozwala również na przekazywanie danych wyjściowych z jednego polecenia bezpośrednio jako danych wejściowych do innego polecenia. Operację potokową uzyskuje się przez umieszczenie znaku '|’ pomiędzy dwoma lub więcej poleceniami w wierszu poleceń. Na przykład, aby policzyć liczbę procesów uruchomionych w systemie, wyjście z polecenia ps może zostać przekazane przez potok do polecenia wc:

$ ps –ef | wc –l

Nie ma ograniczeń co do liczby operacji potokowych, jakie można wykonać w wierszu poleceń. Na przykład, aby znaleźć liczbę wierszy w pliku, które zawierają nazwisko Smith:

$ cat namesfile | grep Smith | wc –l

1.11 Konfigurowanie aliasów

W miarę nabierania biegłości w posługiwaniu się środowiskiem powłoki jest prawdopodobne, że będziesz często wydawał polecenia z tymi samymi argumentami. Na przykład, możesz często używać polecenia ls z opcjami l i t:

$ ls –lt

Aby zmniejszyć ilość wpisywania związanego z wydawaniem polecenia, możliwe jest utworzenie aliasu, który odwzorowuje polecenie i argumenty. Na przykład, aby utworzyć alias taki, że wprowadzenie litery l spowoduje wykonanie polecenia ls -lt, użyto by następującej instrukcji:

$ alias l="ls –lt"

Wprowadzenie l w wierszu poleceń spowoduje teraz wykonanie oryginalnego polecenia.

1.12 Zmienne środowiskowe

Zmienne środowiskowe powłoki zapewniają tymczasowe przechowywanie danych i ustawień konfiguracyjnych. Sama powłoka ustawia pewną liczbę zmiennych środowiskowych, które mogą być zmieniane przez użytkownika w celu modyfikacji zachowania powłoki. Listę aktualnie zdefiniowanych zmiennych można uzyskać przy pomocy polecenia env:

$ envSSH_CONNECTION=192.168.0.19 61231 192.168.0.28 22MODULES_RUN_QUARANTINE=LD_LIBRARY_PATHLANG=en_US.UTF-8HISTCONTROL=ignoredupsHOSTNAME=demo-pc.ebookfrenzy.comXDG_SESSION_ID=15MODULES_CMD=/usr/share/Modules/libexec/modulecmd.tclUSER=demoENV=/usr/share/Modules/init/profile.shSELINUX_ROLE_REQUESTED=PWD=/home/demoHOME=/home/demoSSH_CLIENT=192.168.0.19 61231 22SELINUX_LEVEL_REQUESTED= ...

Prawdopodobnie najbardziej użyteczną zmienną środowiskową jest PATH. Określa ona katalogi, w których powłoka będzie szukać poleceń wprowadzonych z wiersza poleceń, oraz kolejność, w jakiej będzie to robić. Zmienna środowiskowa PATH dla konta użytkownika w nowo zainstalowanym systemie Ubuntu będzie prawdopodobnie skonfigurowany w następujący sposób:

$ echo $PATH/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/ bin:/usr/local/sbin:/usr/sbin

Inną użyteczną zmienną jest HOME, który określa katalog domowy bieżącego użytkownika. Jeśli, na przykład, chciałbyś, by powłoka szukała również poleceń w katalogu scripts znajdującym się w twoim katalogu domowym, zmodyfikowałbyś zmienną PATH w następujący sposób:

$ export PATH=$PATH:$HOME/scripts

Aktualna wartość istniejącej zmiennej środowiskowej może być wyświetlona przy pomocy polecenia echo:

$ echo $PATH

Możesz tworzyć własne zmienne środowiskowe przy pomocy polecenia export. Na przykład:

$ export DATAPATH=/data/files

Przydatna sztuczka z przypisywaniem wyjścia z polecenia do zmiennej środowiskowej polega na użyciu cudzysłowów (`) wokół polecenia. Na przykład, aby przypisać bieżącą datę i czas do zmiennej środowiskowej o nazwie TERAZ:

$ export NOW=`date`$ echo $NOWTue Apr 2 13:48:40 EDT 2020

Jeśli istnieją ustawienia zmiennych środowiskowych lub aliasów, które muszą być konfigurowane przy każdym wejściu do środowiska powłoki, można je dodać do pliku w katalogu domowym o nazwie .bashrc. Na przykład, następujący plik .bashrc jest skonfigurowany do ustawienia zmiennej środowiskowej DATAPATH i aliasu:

# .bashrc # Source global definitionsif ; then . /etc/bashrcfi # User specific environmentPATH="$HOME/.local/bin:$HOME/bin:$PATH"export PATH # Uncomment the following line if you don't like systemctl's auto-paging feature:# export SYSTEMD_PAGER= # User specific aliases and functionsexport DATAPATH=/data/filesalias l="ls -lt"

1.13 Pisanie skryptów powłoki

Do tej pory skupialiśmy się wyłącznie na interaktywnej naturze powłoki Bash. Przez interaktywność rozumiemy ręczne wprowadzanie poleceń na znak zachęty jedno po drugim i ich wykonywanie. W rzeczywistości, jest to tylko niewielka część tego, do czego zdolna jest powłoka. Prawdopodobnie jeden z najpotężniejszych aspektów powłoki obejmuje zdolność do tworzenia skryptów powłoki. Skrypty powłoki są w istocie plikami tekstowymi zawierającymi sekwencje poleceń, które mogą być wykonywane w środowisku powłoki w celu wykonania zadań. Oprócz możliwości wykonywania poleceń, powłoka dostarcza wielu konstrukcji programistycznych, takich jak pętle for i do oraz instrukcje if, których można się spodziewać w języku skryptowym.

Niestety, szczegółowy przegląd skryptów powłoki wykracza poza zakres tego rozdziału. Istnieje jednak wiele książek i zasobów internetowych poświęconych skryptom powłoki, które oddają temu tematowi znacznie więcej sprawiedliwości, niż moglibyśmy mieć nadzieję osiągnąć tutaj. W tej sekcji, zatem, dostarczymy tylko bardzo mały posmak skryptów powłoki.

Pierwszym krokiem w tworzeniu skryptu powłoki jest utworzenie pliku (dla celów tego przykładu nazwiemy go simple.sh) i dodać poniższe jako pierwszą linię:

#!/bin/sh

Znak #! nazywany jest „shebang” i jest specjalną sekwencją znaków wskazującą, że ścieżka do interpretera potrzebnego do wykonania skryptu jest następną pozycją w linii (w tym przypadku jest to plik wykonywalny sh znajdujący się w /bin). Równie dobrze może to być, na przykład, /bin/csh lub /bin/ksh, jeśli któryś z nich jest interpreterem, którego chcesz użyć.

Następnym krokiem jest napisanie prostego skryptu:

#!/bin/shfor i in *do echo $idone

Wszystko co robi ten skrypt to iteracja po wszystkich plikach w bieżącym katalogu i wyświetlenie nazwy każdego z nich. Może to być wykonane przez przekazanie nazwy skryptu jako argumentu do sh:

$ sh simple.sh

Aby uczynić plik wykonywalnym (tym samym negując potrzebę przekazania go do polecenia sh) można użyć polecenia chmod:

$ chmod +x simple.sh

Gdy bit execute został ustawiony w uprawnieniach pliku, może on być wykonany bezpośrednio. Na przykład:

$ ./simple.sh

1.14 Podsumowanie

W tym rozdziale Ubuntu Essentials odbyliśmy krótką wycieczkę po środowisku powłoki Bash. W świecie środowisk graficznych łatwo jest zapomnieć, że prawdziwa moc i elastyczność systemu operacyjnego często może być wykorzystana tylko poprzez zejście poniżej przyjaznego użytkownikowi interfejsu pulpitu i użycie środowiska powłoki. Co więcej, znajomość powłoki jest koniecznością, gdy trzeba administrować i utrzymywać systemy oparte na serwerach, które nie mają zainstalowanego pulpitu lub gdy próbuje się naprawić system, który jest uszkodzony do tego stopnia, że nie można już uruchomić pulpitu lub interfejsu Kokpitu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.