Błyskawiczny kurs pisania skryptów powłoki
Powłoka bash i skrypty powłoki istnieją już od długiego czasu, a każdego dnia nowi użytkownicy poznają ich siłę i możliwości automatyzowania operacji systemowych.
A od kiedy firma Microsoft opracowała dla swojego systemu Windows 10 interaktywną powłokę bash i podsystem Unix, nie można sobie wyobrazić lepszej okazji do przekonania się, jak proste i skuteczne może być tworzenie skryptów powłoki.
Czym w ogóle są skrypty powłoki?
Już na samym początku ery komputerów skrypty powłoki ułatwiały administratorom i programistom wykonywanie żmudnych czaso- i pracochłonnych operacji. Czym więc są skrypty powłoki i dlaczego są one takie ważne? Są to pliki tekstowe służące do wykonywania różnych poleceń w zadanej kolejności i w określonej powłoce (w naszym przypadku w powłoce bash). Powłoka jest to interfejs umożliwiający korzystanie z biblioteki poleceń systemu operacyjnego.
Skrypty powłoki są to niewielkie programy, zbudowane z poleceń dostępnych w powłoce, służące do automatyzowania określonych operacji, najczęściej takich, których nikt nie lubi wykonywać ręcznie, na przykład przeszukiwania stron WWW, śledzenia zajętości dysku, pobierania informacji o pogodzie, zmieniania nazw plików itp. Skrypty mogą być również prostymi grami! Mogą zawierać proste struktury logiczne, na przykład instrukcję if, którą zapewne znasz z innych języków programowania. Zazwyczaj jednak skrypty są bardzo proste, o czym się niebawem przekonasz.
W systemach macOS, BSD i Linux istnieje wiele różnych powłok, na przykład tcsh, zsh i najbardziej popularna bash. W tej książce skupimy się na podstawie systemu Unix, czyli powłoce bash. Każda powłoka ma własne funkcje i możliwości, jednak to właśnie bash jest powłoką, z którą zapoznaje się większość użytkowników w pierwszej kolejności. W systemie macOS za pomocą programu Terminal otwiera się okno z powłoką bash (patrz rysunek 0.1). W systemie Linux programy udostępniające powłokę są bardzo różne, ale najczęściej w środowisku Gnome jest to gnome-terminal, a w KDE — konsole. Programy te mają własne konfiguracje i typy terminali, ale wszystkie domyślnie wykorzystują powłokę bash. Jeżeli korzystasz z jakiegokolwiek systemu Unix, po otwarciu terminala powinna domyślnie pojawić się ta właśnie powłoka.
Rysunek 0.1. Terminal w systemie macOS zawierający powłokę bash
UWAGA
W sierpniu 2016 r. firma Microsoft udostępniła rocznicową aktualizację systemu Windows 10. Jeżeli więc korzystasz z tego systemu, oznacza to, że możesz korzystać z powłoki bash. W dodatku A znajdziesz informacje, jak zainstalować powłokę w tym systemie, jednak w całej książce przyjęliśmy założenie, że korzystasz z systemu z rodziny Unix, na przykład macOS lub Linux. Możesz śmiało sprawdzić opisane skrypty w systemie Windows 10, jednak nie możemy dać gwarancji, że będą one działać poprawnie. Nie sprawdziliśmy, jak nasze skryty działają w systemie Windows 10! Jednak piękno powłoki bash polega na jej uniwersalności, więc wiele skryptów opisanych w tej książce powinno „po prostu działać”.
Interakcja z systemem operacyjnym za pomocą terminala może wydawać się niewdzięcznym zajęciem. Jednak po upływie pewnego czasu przekonasz się, że czymś bardziej naturalnym będzie otwarcie terminala i szybkie wprowadzenie zmian w systemie niż klikanie myszą w różnych menu w poszukiwaniu potrzebnej opcji.
Wykonywanie poleceń
Głównym przeznaczeniem powłoki bash jest wykonywanie poleceń systemowych. Zajmijmy się prostym poleceniem wyświetlającym tekst „Witaj, świecie”. W powłoce bash do wyświetlania tekstu na ekranie służy polecenie echo:
$ echo "Witaj, świecie";
Wpisz powyższe polecenie w terminalu, a na ekranie pojawi się napis Witaj, świecie. Powyższy kod powoduje wykonanie polecenia echo, zawartego w standardowej bibliotece powłoki bash. Katalogi, które powłoka przeszukuje pod kątem standardowych poleceń, zapisane są w zmiennej środowiskowej o nazwie PATH. Do wyświetlenia wartości tej zmiennej możesz również użyć polecenia echo, jak w listingu 0.1.
Listing 0.1. Wyświetlenie wartości zmiennej środowiskowej PATH
$ echo $PATH
/Users/bperry/.rvm/gems/ruby-2.1.5/bin:/Users/bperry/.rvm/gems/ruby-2.1.5@
global/bin:/Users/bperry/.rvm/rubies/ruby-2.1.5/bin:/usr/local/bin:/usr/bin:/ bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/Users/bperry/.rvm/bin [/sourcecode]
UWAGA
W listingach zawierających zarówno wpisywane polecenia, jak również wyniki ich wykonania wyróżnione są one pogrubioną czcionką i zaczynają się od znaku $.
Nazwy katalogów w powyższej zmiennej oddzielone są średnikami. Są to wszystkie katalogi, które powłoka przeszukuje w celu uruchomienia programu lub wykonania polecenia. Jeżeli Twój skrypt nie będzie zapisany w którymś z powyższych katalogów, wtedy powłoka nie będzie w stanie go wykonać. Pamiętaj również, że katalogi są przeszukiwane w podanej kolejności. Jest to ważne w przypadku, gdy dwa różne skrypty o takich samych nazwach zapisane są w różnych katalogach wymienionych w zmiennej PATH. Jeżeli nie będziesz mógł znaleźć jakiegoś skryptu, użyj polecenia which z nazwą szukanego skryptu. Pojawi się wtedy nazwa katalogu, w którym ten skrypt się znajduje, jak w listingu 0.2.
Listing 0.2. Wyszukiwanie poleceń w katalogach PATH za pomocą polecenia which
$ which ruby
/Users/bperry/.rvm/rubies/ruby-2.1.5/bin/ruby
$ which echo
/bin/echo
Wzbogacony o tę wiedzę przenieś lub skopiuj swój skrypt do jednego z katalogów wymienionych w zmiennej PATH, jak w listingu 0.1, i zacznij go używać. Podczas pracy z tą książką często będziesz używał polecenia which do określania pełnych ścieżek do swoich skryptów. Jest to polecenie, które przydaje się do diagnozowania błędnej lub skomplikowanej zmiennej PATH.
Konfigurowanie skryptu logowania
W tej książce opisujemy skrypty, które są wykorzystywane w innych skryptach, dlatego metoda łatwego ich wywoływania jest bardzo ważna. Zdefiniuj zmienną PATH tak, abyś zaraz po otwarciu powłoki mógł od razu wywoływać nowo utworzone skrypty tak jak inne polecenia. Pierwszą operacją wykonywaną przez system operacyjny po otwarciu powłoki jest odczytanie skryptu logowania zapisanego w katalogu domowym (/Users/
echo To jest .profile [/sourcecode]
W każdym przypadku w miejscu ostatniego słowa umieść nazwę skryptu, a następnie zaloguj się ponownie do systemu. W oknie terminala na samym początku pojawi się wiersz z informacją o skrypcie uruchomionym podczas logowania. Napis To jest .profile będzie oznaczał, że został wykonany skrypt .profile, napis To jest .bashrc — że był to skrypt .bashrc, itd. Teraz już wiesz, który to plik! W zależności od powłoki uruchamiany jest inny skrypt.
Skrypt logowania możesz zmienić tak, aby w zmiennej PATH były umieszczone nazwy innych katalogów. Możesz również zmieniać wszelkie ustawienia powłoki, konfigurować znak zachęty czy definiować zmienną PATH na własne sposoby. Dla przykładu użyj teraz polecenia cat do sprawdzenia zawartości dostosowanego skryptu .bashrc. Argumentem tego polecenia jest nazwa pliku, którego zawartość ma być wyświetlona w terminalu, jak w listingu 0.3.
Listing 0.3. Ten dostosowany skrypt .bashrc dopisuje do zawartości zmiennej PATH katalog RVM
$ cat ~/.bashrc
export PATH="$PATH:$HOME/.rvm/bin" # Dodanie katalogu RVM ze skryptami
Powyższe polecenie powoduje wyświetlenie zawartości pliku .bashrc, w którym do zmiennej PATH dopisywany jest lokalny katalog narzędzia RVM (ang. Ruby version manager) wykorzystywany do zarządzania zainstalowanymi wersjami środowiska Ruby. Ponieważ skrypt .bashrc dostosowuje zmienną PATH podczas każdorazowego otwierania powłoki, więc wybrana instalacja RVM będzie zawsze domyślnie dostępna w systemie.
Podobnego rodzaju dostosowania możesz wprowadzić po to, aby domyślnie były dostępne Twoje skrypty. W tym celu najpierw utwórz katalog, w którym będziesz zapisywał swoje skrypty. Następnie w skrypcie logowania dopisz ten katalog do zmiennej PATH. Dzięki temu będziesz mógł o wiele łatwiej odwoływać się do swoich skryptów.
Aby wyświetlić w terminalu nazwę swojego katalogu domowego, użyj polecenia echo $HOME. Następnie przejdź do tego katalogu i otwórz w nim katalog na skrypty (proponujemy nazwę skrypty). Teraz w edytorze tekstowym otwórz skrypt logowania i na jego początku wpisz poniższy wiersz, zamieniając ścieżkę ścieżka/do/katalogu/skrypty na nazwę swojego katalogu ze skryptami:
export PATH="ścieżka/do/katalogu/skrypty/:$PATH"
Po wprowadzeniu powyższej zmiany wszystkie skrypty, które zapiszesz w swoim katalogu, będziesz mógł wywoływać podobnie jak polecenia.
Uruchamianie skryptów
Do tej pory użyłeś kilku poleceń — echo, which oraz cat. Jednak wszystkie wpisywałeś pojedynczo w terminalu, a nie wszystkie razem w skrypcie. Napisz teraz skrypt, przedstawiony w listingu 0.4, w którym wszystkie te polecenia będą wykonywane jedno po drugim. Ten skrypt będzie wyświetlał napis Witaj, świecie, a pod nim ścieżkę do skryptu neqn, który powinien być domyślnie dostępny we wszystkich Twoich skryptach. Uzyskaną ścieżkę wykorzystaj następnie do wyświetlenia zawartości skryptu neqn (na razie nie jest ona istotna, służy tylko jako przykład). Jest to dobry wzór zastosowania skryptu do wykonania serii operacji w określonej kolejności, w tym przypadku wyświetlenia pełnej ścieżki do pliku i sprawdzenia jego zawartości.
Listing 0.4. Zawartość Twojego pierwszego skryptu
echo "Witaj, świecie"
echo $(which neqn)
cat $(which neqn)
Otwórz swój ulubiony edytor tekstowy (najpopularniejsze edytory to vim lub gedit w systemie Linux oraz TextEdit w systemie macOS) i wpisz w nim zawartość listingu 0.4. Zapisz skrypt w utworzonym wcześniej katalogu i nadaj mu nazwę intro. Nazwy skryptów nie muszą mieć specjalnego rozszerzenia, więc nie wpisuj go wcale (jeżeli chcesz, możesz użyć rozszerzenia .sh, ale nie jest to konieczne). W pierwszym wierszu powyższego skryptu znajduje się polecenie echo wyświetlające po prostu napis Witaj, świecie. Drugi wiersz jest nieco bardziej skomplikowany — zawiera polecenie which wyszukujące ścieżkę do skryptu neqn oraz polecenie echo wyświetlające tę ścieżkę w terminalu. Aby można było użyć tych dwóch poleceń jednocześnie, przy czym wynik pierwszego polecenia zastosować jako argument drugiego, otwierana jest podpowłoka. W tym przypadku w podpowłoce wykonywane jest polecenie which, wracające pełną ścieżkę do skryptu neqn. Ścieżka ta następnie jest wykorzystywana jako argument polecenia echo, które wyświetla ścieżkę na ekranie. W ostatnim wierszu ta sama sztuczka jest zastosowana do podania ścieżki w argumencie polecenia cat, wyświetlającego zawartość skryptu neqn.
Po zapisaniu skryptu możesz go uruchomić w terminalu. Wynik tej operacji przedstawia listing 0.5.
Listing 0.5. Uruchomienie pierwszego własnego skryptu
$ sh intro
Witaj, świecie
/usr/bin/neqn
#!/bin/sh
# Provision of this shell script should not be taken to imply that use of
# GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
GROFF_RUNTIME="${GROFF_BIN_PATH=/usr/bin}:"
PATH="$GROFF_RUNTIME$PATH"
export PATH
exec eqn -Tascii ${1+"$@"}
# eof
$
Uruchom skrypt, wykorzystując polecenie sh z argumentem intro. Polecenie to odczytuje kolejne wiersze skryptu i wykonuje zawarte w nich polecenia tak samo, jak robi to powłoka w terminalu. Jak widzisz, na ekranie pojawił jest napis Witaj, świecie , pod nim ścieżka do skryptu neqn , a na końcu zawartość tego krótkiego skryptu zapisanego na dysku (która w zależności od wersji systemu macOS lub Linux może wyglądać inaczej).
Prostsze uruchamianie skryptów
Do uruchamiania skryptów nie musisz wykorzystywać polecenia sh. Jeżeli wpiszesz w nim jeden dodatkowy wiersz, a potem zmienisz uprawnienia skryptu, będziesz mógł wywoływać go wprost, tak jak inne polecenia, bez poprzedzania go poleceniem sh. W edytorze wpisz w skrypcie intro następujący wiersz:
#!/bin/bash ///1
echo "Witaj, świecie"
echo $(which neqn)
cat $(which neqn)
Na samym początku wpisałeś ścieżkę systemową /bin/bash . Jest to tzw. shebang. Ścieżka ta określa nazwę programu, który ma być użyty do zinterpretowania skryptu. W tym przypadku jest to program bash. Być może spotkałeś się z innymi ścieżkami, stosowanymi w skryptach napisanych w języku Perl (#!/usr/bin/perl) lub Ruby (#!/usr/bin/env ruby).
Po wpisaniu na początku skryptu nowego wiersza musisz jeszcze zmienić uprawnienia do skryptu, aby można go było uruchamiać tak jak program. W tym celu wpisz w terminalu polecenia pokazane w listingu 0.6.
Listing 0.6. Nadanie skryptowi intro uprawnień umożliwiających uruchamianie go
$ chmod +x intro
$ ./intro
Witaj, świecie
/usr/bin/neqn
#!/bin/sh
# Provision of this shell script should not be taken to imply that use of
# GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported.
GROFF_RUNTIME="${GROFF_BIN_PATH=/usr/bin}:"
PATH="$GROFF_RUNTIME$PATH"
export PATH
exec eqn -Tascii ${1+"$@"}
# eof
$
Do zmiany uprawnień użyłeś polecenia chmod z argumentem +x umożliwiającym uruchamianie skryptu oraz z nazwą tego skryptu. Po nadaniu uprawnień możesz skrypt uruchamiać tak jak program , bez konieczności bezpośredniego wywoływania powłoki. Powyższa operacje jest dobrą praktyką, bardzo przydatną, o czym się przekonasz w trakcie doskonalenia swoich umiejętności. Większości skryptów prezentowanych w tej książce będziesz musiał nadać takie same uprawnienia jak skryptowi intro.
Powyższy skrypt jest prostym przykładem demonstrującym sposób uruchamiania skryptów i wykorzystywania ich do wykonywania różnych poleceń. W wielu skryptach opisanych w tej książce będziesz stosował powyższe metody, a w przyszłości, podczas eksperymentowania ze swoimi skryptami, będziesz nieustannie stosował ścieżki shebang.
Po co stosować skrypty powłoki?
Być może dziwisz się, po co stosować skrypty powłoki zamiast ciekawych nowych języków, na przykład Ruby lub Go. Przeznaczeniem tych języków jest zapewnienie kompatybilności tworzonych za ich pomocą skryptów z różnymi systemami operacyjnymi. Języki te jednak nie są domyślnie instalowane w systemie z prostego powodu: każdy system Unix zawiera podstawową powłokę, którą w ogromnej większości przypadków jest bash. Jak wspomnieliśmy na początku rozdziału, ostatnio firma Microsoft udostępniła w systemie Windows 10 taką samą powłokę, jaką zawierają najważniejsze dystrybucje systemu Linux i macOS. Oznacza to, że skrypty powłoki będą jeszcze bardziej kompatybilne niż dotąd, a ich ewentualne dostosowanie będzie wymagało włożenia niewielkiego wysiłku. Ponadto operacje systemowe i utrzymaniowe łatwiej i szybciej wykonuje się za pomocą skryptów powłoki, a nie skryptów napisanych w innych językach. Powłoka bash ma pewne swoje ograniczenia, ale w trakcie pracy z tą książką nauczysz się je omijać.
Listing 0.7 przedstawia przykład krótkiego, poręcznego, w pełni uniwersalnego skryptu (tak, jednowierszowego!). Skrypt ten wyświetla całkowitą liczbę stron dokumentów zapisanych w katalogu pakietu OpenOffice i jest szczególnie przydatny dla osób, które dużo piszą.
Listing 0.7. Skrypt powłoki wyświetlający całkowitą liczbę stron dokumentów zapisanych w katalogu pakietu OpenOffice
#!/bin/bash
echo "$(exiftool *.odt | grep Page-count | cut -d ":" -f2 | tr '\n' '+')""0" | bc
Nie będziemy teraz opisywać szczegółów działania tego skryptu — przecież to dopiero początek! Jednak ogólnie mówiąc, skrypt ten wyodrębnia ze wszystkich dokumentów informacje o liczbach stron, łączy je za pomocą znaków dodawania w jeden ciąg i przekazuje do kalkulatora, który wyświetla sumaryczną wartość. Wszystkie operacje wykonywane są w jednym wierszu. W tej książce znajdziesz więcej takich ciekawych przykładów, a gdy nabędziesz praktyki, okaże się, że powyższy skrypt jest zupełnie zrozumiały i bardzo prosty!
Bierzmy się do dzieła
Jeżeli wcześniej tego nie wiedziałeś, to teraz już masz ogólne wyobrażenie, czym są skrypty powłoki. Tworzenie króciutkich skryptów wykonujących określone operacje jest istotą korzystania z systemu Unix. Gdy będziesz umiał tworzyć własne skrypty i dostosowywać system Unix do własnych potrzeb, staniesz się profesjonalistą. Ten rozdział zawiera jedynie przedsmak tego, co znajdziesz w tej książce: sporo naprawdę niesamowitych skryptów powłoki!
Tekst pochodzi z książki "Genialne skrypty powłoki. Ponad 100 rozwiązań dla systemów Linux, macOS i Unix" (Dave Taylor, Brandon Perry) - Wyd. Helion 2017.
Zobacz nasze propozycje
-
- Druk
(29,94 zł najniższa cena z 30 dni)
29.94 zł
49.90 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(26,94 zł najniższa cena z 30 dni)
35.92 zł
44.90 zł (-20%) -
- Druk
- PDF + ePub + Mobi
- Audiobook MP3
(29,94 zł najniższa cena z 30 dni)
29.94 zł
49.90 zł (-40%) -
- Druk
(53,40 zł najniższa cena z 30 dni)
53.40 zł
89.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(35,40 zł najniższa cena z 30 dni)
35.40 zł
59.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(35,40 zł najniższa cena z 30 dni)
35.40 zł
59.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(47,40 zł najniższa cena z 30 dni)
47.40 zł
79.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(29,49 zł najniższa cena z 30 dni)
35.40 zł
59.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(47,40 zł najniższa cena z 30 dni)
47.40 zł
79.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(47,40 zł najniższa cena z 30 dni)
47.40 zł
79.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(23,94 zł najniższa cena z 30 dni)
23.94 zł
39.90 zł (-40%) -
- Druk
(107,40 zł najniższa cena z 30 dni)
107.40 zł
179.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(35,40 zł najniższa cena z 30 dni)
35.40 zł
59.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(53,40 zł najniższa cena z 30 dni)
53.40 zł
89.00 zł (-40%) -
- Druk
(77,40 zł najniższa cena z 30 dni)
77.40 zł
129.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(47,40 zł najniższa cena z 30 dni)
47.40 zł
79.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(23,94 zł najniższa cena z 30 dni)
23.94 zł
39.90 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(39,50 zł najniższa cena z 30 dni)
47.40 zł
79.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
- Audiobook MP3
(29,40 zł najniższa cena z 30 dni)
29.40 zł
49.00 zł (-40%) -
- Druk
- PDF + ePub + Mobi
(41,40 zł najniższa cena z 30 dni)
41.40 zł
69.00 zł (-40%)