Środowisko programisty/Wprowadzenie do Basha: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pan (dyskusja | edycje)
Zaczynamy pracować: Dokumentacja
Pan (dyskusja | edycje)
Linia 32: Linia 32:


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Shell może ułatwiać nam wykonywanie nawet bardzo skomplikowanych czynności. Spójrzmy na następujący przykład. Załóżmy, że mamy projekt o nazwie ecmnet, którego źródła znajdują sie w katalogu o tej samej nazwie. Chcemy wysłać sobie mailem archiwum z źródłami tego projektu. Chcemy również, aby w tym archiwum nie znalazły się pliki o rozszerzeniu bak, czy kończące się znakiem ~. Ponadto nazwa archiwum powinna zawierać aktulną datę z dokładności co do sekundy. Oto jak może wyglądać przykładowa sesja w bashu realizujaca te zadanie .
Shell nawet z linii komend umożliwia nam wykonywanie nawet bardzo skomplikowanych czynności. Spójrzmy na następujący przykład. Załóżmy, że mamy projekt o nazwie ecmnet, którego źródła znajdują sie w katalogu o tej samej nazwie. Chcemy wysłać sobie mailem archiwum z źródłami tego projektu. Chcemy również, aby w tym archiwum nie znalazły się pliki o rozszerzeniu bak, czy kończące się znakiem ~. Ponadto nazwa archiwum powinna zawierać aktulną datę z dokładności co do sekundy. Oto jak może wyglądać przykładowa sesja w bashu realizujaca te zadanie .
<div class="mw-collapsible-content" style="display:none"><flash>file=SrodowiskoProgramisty-bash01.swf|width=484|height=316|quality=low|loop=false</flash></div>
<div class="mw-collapsible-content" style="display:none"><flash>file=SrodowiskoProgramisty-bash01.swf|width=484|height=316|quality=low|loop=false</flash></div>
</div>
</div>
Wiele rzeczy, czy też niektóre komendy mogą być w tym momencie niezrozumiałe, niemniej warto być świadomym możliwości, że tego typu czynności można wykonywać bardzo sprawnie. Skomentujmy po krótce przeznaczenie użytych poleceń, o których więcej szczegółów zostanych podanych w trakcie kursu.
Wiele rzeczy, czy też niektóre komendy mogą być w tym momencie niezrozumiałe, niemniej warto być świadomym możliwości, że tego typu czynności można wykonywać bardzo sprawnie. Skomentujmy po krótce przeznaczenie użytych poleceń, o których więcej szczegółów zostanych podanych w trakcie kursu. Zwróćmy uwagę również na możliwości edycyjne basha. Przy edycji komendy możemy używać klawiszy intuicyjnie tak jak ma się to w zwykłych edytorach. Jednak w bashu są również typowe dla niego funkcje. Nie będziemy omawiać tutaj szczegółów. Pokażemy tylko parę przykładów, a zainteresowanych odsyłamy do dokumentacji basha.
 
Omówmy nasz przykład.
  bashtest@host:~$ cp -a ecmnet/ /tmp/
  bashtest@host:~$ cp -a ecmnet/ /tmp/
cp -a kopiuje rekurencyjnie katalog ecment do katalogu /tmp/ (jest to standardowy katalog, w którym trzyma się pliki tymczasowe).  
cp -a kopiuje rekurencyjnie katalog ecment do katalogu /tmp/ (jest to standardowy katalog, w którym trzyma się pliki tymczasowe). Zamiast pisać pełną nazwę katalogu wpisujemy tylko ec i wciskamy Tab, co powoduję automatyczne rozwinięcie do ecmnet/. Tab służy do rozwijania komend oraz nazw plików.
  bashtest@host:~$ cd /tmp/
  bashtest@host:~$ cd /tmp/
Zmienia aktualny katalog na /tmp.
Zmienia aktualny katalog na /tmp.
Linia 43: Linia 45:
  bashtest@host:/tmp$ find ecmnet/ -name "*.bak" -o -name "*~" -execdir rm -f {} +
  bashtest@host:/tmp$ find ecmnet/ -name "*.bak" -o -name "*~" -execdir rm -f {} +
find potrafi wyszukiwać pliki rekurencyjnie w rozmaity sposób i nie tylko. W tym przypadku użyliśmy go do znalezienia plików o rozszerzeniu bak lub kończących się znakiem ~. W drugiej linii zmodyfikowaliśmy komendę tak, aby te znalezione pliki zostałe od razu usunięte.
find potrafi wyszukiwać pliki rekurencyjnie w rozmaity sposób i nie tylko. W tym przypadku użyliśmy go do znalezienia plików o rozszerzeniu bak lub kończących się znakiem ~. W drugiej linii zmodyfikowaliśmy komendę tak, aby te znalezione pliki zostałe od razu usunięte.
Aby wpisać drugą komendę wystarczy wcisnąć strzałkę do góry i dopisać brakujący kawałek. Za pomocą strzałek w góre i w dół możemy przeglądać historię wpisywanych poleceń.
  bashtest@host:/tmp$ date +%Y%m%d%H%M%S
  bashtest@host:/tmp$ date +%Y%m%d%H%M%S
date służy wyświetla aktulną datę/godziny lub jej zmieniania. W tym przypadku wyświetlamy datę w odpowiednim formacie.
date służy wyświetlania aktulnej daty/godziny lub jej zmieniania. W tym przypadku wyświetlamy datę w odpowiednim formacie.
  bashtest@host:/tmp$ tar cvz ecmnet/ | uuencode ecmnet-`date +%Y%m%d%H%M%S`.tgz | mail me@somehost
  bashtest@host:/tmp$ tar cvz ecmnet/ | uuencode ecmnet-`date +%Y%m%d%H%M%S`.tgz | mail me@somehost
Tutaj mamy przykład potoku. Komenda tar służy do składania plików w jedno archiwum z lub bez kompresji. To co wyprodukuje ta komenda jest przekazywane komendzie uuencode, która służy do kodowania plików binarnych, tak aby mogły być użyte w mediach tekstowych. Wynik wywołania komendy date jest użyty do  nazwania pliku archiwum. Ostateczny wynik dostaje komenda mail, która wysyła go na adres me@somehost.
Tutaj mamy przykład potoku. Komenda tar służy do składania plików w jedno archiwum z lub bez kompresji. To co wyprodukuje ta komenda jest przekazywane komendzie uuencode, która służy do kodowania plików binarnych, tak aby mogły być użyte w mediach tekstowych. Wynik wywołania komendy date jest użyty do  nazwania pliku archiwum. Ostateczny wynik dostaje komenda mail, która wysyła go na adres me@somehost.
Żeby nie pisać ponownie komendy date wraz ze trudnym do wpisania formatem daty, wciskamy strzałkę do góry, aby uzyskać przed chwilą wpisaną komendą date. Następnie przechodzimy na początek komendy (Ctrl-A lub Home) i wciskamy Ctrl-K. Powoduje to usunięcie wszystkich znaków od pozycji kursora do końca linii i umieszczenie ich w buforze. Później, przy edycji, gdy dochodzimy do momentu wpisania komendy date ponownie, wciskamy Ctrl-Y i zostaje umieszczone to co jest aktualnie w buforze.
  bashtest@host:/tmp$ rm -rf ecmnet/
  bashtest@host:/tmp$ rm -rf ecmnet/
Usuwa rekurencyjnie katalog ecmnet.
Usuwa rekurencyjnie katalog ecmnet.

Wersja z 16:04, 12 lip 2006

Czym jest bash?

Bash (Bourne-Again Shell) jest najpopularniejszą odmianą shell'a. Innymi znanymi są np. ksh (Korn Shell), csh (C Shell).

Shell możemy kojarzyć z linią poleceń, dzięki ktorej możemy wpisywać komendy z klawiatury służące na ogół do uruchamiania innych programów, poleceń lub wyświetlania informacji. Shell służy też do uruchamiania własnoręcznie napisanych skryptów.

Najprostsze skrypty są po prostu ciągiem poleceń, ale możemy też pisać bardziej skomplikowane mechanizmy, które w istocie rzeczy można nazwać wręcz programami. Składnia skryptów nie jest skomplikowana. Oprócz znajomości różnych programów użytkowych i systemowych, jest zaledwie kilka reguł, które wystarczy się nauczyć, żeby swobodnie pisać skrypty składające poznane programy w celu wykonania zaplanowanych działań.

Shell jest podstawowym narzędziem pod system typu UNIX, ale nie tylko. Pod Windowsem mamy np. interpretator poleceń, a skryptami są np. pliki o rozszerzeniu bat. Niemniej możliwości i funkcjonalność takich skryptów pod Windowsem są znikome w porównania do basha pod Unixem, ze względu na ograniczenia składniowe, jak i dostępny zbiór polecenień użytkowych. Aby uzyskać możliwość uruchamiania skryptów napisanych w Bashu pod Windowsem możemy sobie zainstalować pakiet Cygwin.

Do czego się przydaje?

Skrypty pisze się jak chce się zautomatyzować lub uprościć jakąś czynność, powtarzalną badź nie. Czynności te, to

  • kompilacja, budowanie aplikacji,
  • przetwarzanie plików (tworzenie, usuwanie, szukanie, itp.),
  • prosta obróbka (np. tekstowa) plików,
  • administracja systemem (np. konfiguracja, uruchamianie demonów),
  • i wiele innych...

Do czego się nie nadaje?

Bash jest interpreterem. Skryptów napisanych w bashu się nie kompiluje. Nie ma też żadnych skomplikowanych struktur danych (jak tablice wielowymiarowe, czy drzewa), ani konstrukcji znanych z języków wyższych poziomów (jak rekordy, klasy). W związku z tym skrypty nie nadają się na przykład do:

  • zadań trudnych obliczeniowo, wymagających szybkiego działania,
  • operacji skomplikowanych algorytmicznie, czy też matematycznie,
  • operacji niskopoziomowych, jak dostęp do sprzętu.

Zaczynamy pracować

Przykład

Shell nawet z linii komend umożliwia nam wykonywanie nawet bardzo skomplikowanych czynności. Spójrzmy na następujący przykład. Załóżmy, że mamy projekt o nazwie ecmnet, którego źródła znajdują sie w katalogu o tej samej nazwie. Chcemy wysłać sobie mailem archiwum z źródłami tego projektu. Chcemy również, aby w tym archiwum nie znalazły się pliki o rozszerzeniu bak, czy kończące się znakiem ~. Ponadto nazwa archiwum powinna zawierać aktulną datę z dokładności co do sekundy. Oto jak może wyglądać przykładowa sesja w bashu realizujaca te zadanie .

Wiele rzeczy, czy też niektóre komendy mogą być w tym momencie niezrozumiałe, niemniej warto być świadomym możliwości, że tego typu czynności można wykonywać bardzo sprawnie. Skomentujmy po krótce przeznaczenie użytych poleceń, o których więcej szczegółów zostanych podanych w trakcie kursu. Zwróćmy uwagę również na możliwości edycyjne basha. Przy edycji komendy możemy używać klawiszy intuicyjnie tak jak ma się to w zwykłych edytorach. Jednak w bashu są również typowe dla niego funkcje. Nie będziemy omawiać tutaj szczegółów. Pokażemy tylko parę przykładów, a zainteresowanych odsyłamy do dokumentacji basha.

Omówmy nasz przykład.

bashtest@host:~$ cp -a ecmnet/ /tmp/

cp -a kopiuje rekurencyjnie katalog ecment do katalogu /tmp/ (jest to standardowy katalog, w którym trzyma się pliki tymczasowe). Zamiast pisać pełną nazwę katalogu wpisujemy tylko ec i wciskamy Tab, co powoduję automatyczne rozwinięcie do ecmnet/. Tab służy do rozwijania komend oraz nazw plików.

bashtest@host:~$ cd /tmp/

Zmienia aktualny katalog na /tmp.

bashtest@host:/tmp$ find ecmnet/ -name "*.bak" -o -name "*~"
bashtest@host:/tmp$ find ecmnet/ -name "*.bak" -o -name "*~" -execdir rm -f {} +

find potrafi wyszukiwać pliki rekurencyjnie w rozmaity sposób i nie tylko. W tym przypadku użyliśmy go do znalezienia plików o rozszerzeniu bak lub kończących się znakiem ~. W drugiej linii zmodyfikowaliśmy komendę tak, aby te znalezione pliki zostałe od razu usunięte.

Aby wpisać drugą komendę wystarczy wcisnąć strzałkę do góry i dopisać brakujący kawałek. Za pomocą strzałek w góre i w dół możemy przeglądać historię wpisywanych poleceń.

bashtest@host:/tmp$ date +%Y%m%d%H%M%S

date służy wyświetlania aktulnej daty/godziny lub jej zmieniania. W tym przypadku wyświetlamy datę w odpowiednim formacie.

bashtest@host:/tmp$ tar cvz ecmnet/ | uuencode ecmnet-`date +%Y%m%d%H%M%S`.tgz | mail me@somehost

Tutaj mamy przykład potoku. Komenda tar służy do składania plików w jedno archiwum z lub bez kompresji. To co wyprodukuje ta komenda jest przekazywane komendzie uuencode, która służy do kodowania plików binarnych, tak aby mogły być użyte w mediach tekstowych. Wynik wywołania komendy date jest użyty do nazwania pliku archiwum. Ostateczny wynik dostaje komenda mail, która wysyła go na adres me@somehost.

Żeby nie pisać ponownie komendy date wraz ze trudnym do wpisania formatem daty, wciskamy strzałkę do góry, aby uzyskać przed chwilą wpisaną komendą date. Następnie przechodzimy na początek komendy (Ctrl-A lub Home) i wciskamy Ctrl-K. Powoduje to usunięcie wszystkich znaków od pozycji kursora do końca linii i umieszczenie ich w buforze. Później, przy edycji, gdy dochodzimy do momentu wpisania komendy date ponownie, wciskamy Ctrl-Y i zostaje umieszczone to co jest aktualnie w buforze.

bashtest@host:/tmp$ rm -rf ecmnet/

Usuwa rekurencyjnie katalog ecmnet.

bashtest@host:/tmp$ cd

Zmienia katalog z powrotem na domowy katalog użytkownika.

Dokumentacja

W powyższym przykładzie widzimy, że główną siłą była znajomość komend i opcji z jakimi trzeba ich użyć. Jeśli chodzi o uzyskiwanie informacji na temat opcji danej komendy, to z pomocą przychdzą nam dwa polecenia:

  1. man
  2. info

Na przykład, żeby dowiedzieć się co oznacza magiczne +%Y%m%d%H%M%S przy poleceniu date możemy napisać :

bashtest@host:~$ man date

Dostajemy tekstowy opis komendy date wraz z wszystkimi opcjami, który możemy sobie spokojnie poprzeglądać. Komenda info jest podobna do komendy man z tą różnicą, że daje jeszcze większą wygodę porusznia się i na ogół jest znacznie więcej informacji. W niektórych dystrybucjach linuxa większość informacji o dostępnych komendach użytkowych można uzyskać na przykład poprzez polecenie:

bashtest@host:~$ info coreutils

Gdzie znaleźć jakie w ogóle są komendy? Wiele z nich wymienionych jest własnie w info coreutils. Inne komendy można samemu spróbować poszukać w liście zainstalowanych pakietów danej dystrybucji. Jednak takie szukanie jest czasochłonne. Tak naprawdę lista wszystkich poleceń nie istnieje, gdyż co chwilę powstają nowe programy dające nowe możliwości lub ułatwiające życie.

W tym kursie przedstawimy podstawowe narzędzia, które powinny w praktyce wystarczyć do większości celów. Jednak przy potrzebie bardziej wysublimowanych komend, trzeba będzie odpowiednie narzędzie znaleźć lub też samemu napisać używając bardziej zaawansowanych języków jak Perl, Python, C, czy Java.