BASH - Bourne Again SHell Interpreter poleceń powłoki BASH Interpreter poleceń powłoki jest to interfejs pomiędzy użytkownikiem, a jądrem systemu. Dzięki niemu, jeśli wydajemy za pomocą klawiatury polecenie powłoka zamienia dane na język zrozumiały przez jądro systemu, który wie, że ma np. uruchomić bądź zatrzymać program. Jedną z takich powłok jest BASH stworzony przez Briana Foxa i Cheta Rameya i udostępniony na zasadach licencji GNU. Jest on jedną z lepszych powłok i w wielu systemach linuxowych wykorzystywany jako domyślna, przez co zapewne i Ty jej używasz :-) Zawiera 48 wbudowanych poleceń (biult-in) oraz 12 funkcji wywołania. Jest w pełni kompatybilny z powłoką sh oraz zawiera wiele ciekawych rozwiązań przejętych od powłok Korn i C (ksh i csh). Dokańczanie poleceń
Dokańczanie poleceń jest bardzo wygodną i przyspieszającą pracę opcją powłoki Bash. Dzięki niej nie musimy już wpisywać pełnej nazwy programu (ścieżki do katalogu, pliku itp) lub znać jego dokładnej nazwy. Wystarczy, że wpiszemy jego pierwszą literkę i wciśniemy klawisz TAB. Wtedy Linux spróbuje wyszukać wszystkie dostępne programy, katalogi, pliki, których pierwsza litera nazwy odpowiada wpisanej przez nas. Jeśli więcej programów zaczyna się na tę sam znak powłoka wylistuje nam ich nazwy i poinformuje nas za pomocą brzęczyka, że należy podać dodatkowe informacje. Dzieje się to zazwyczaj, gdy podamy tylko jedną, bądź dwie pierwsze litery, ale już np wpisanie mut i wciśnięcie TAB, najprawdopodobniej spowoduje poprawne dokończenie nazwy programu na mutt! Jeśli wpiszemy nazwę z błędem np. mot, które nie ma odniesienia w rzeczywistości i naciśniemy TAB interpreter poinformuje nas o błędzie wydając z brzęczyka systemowego charakterystyczny dzwięk. Jest to dla nas sygnał, że coś jest nie w porządku i należy poprawić. Historia poleceń
Bash zapamiętuje wydane przez użytkownika polecenia. Dzięki temu za pomocą klawiszy kursora (góra - dół), możemy szybko przywołać polecenie, które już wcześniej wydaliśmy. Jest to szczególnie przydatne gdy w bardzo skomplikowanym poleceniu zmieniamy np. tylko nazwę pliku, na którym ma zostać wykonane, a cała składnia polecenia nie ulega modyfikacjom. Lista wydanych przez nas poleceń jest ładowana z pliku historii, który domyślnie nosi nazwę .bash_history. Parametry nazwy pliku historii oraz ilości przechowywanych w nim ostatnio wydanych poleceń ustalają zmienne HISTFILE oraz HISTSIZE, ale o zmiennych powłoki Bash trochę później. W tym miejscu warto zaznaczyć, że w wielu dystrybucjach Linuxa zmienna HISTSIZE ma wartość 1000 co powoduje, że w pliku .bash_history zapisywanych jest 1000 wydanych ostatnio poleceń. Aby obejrzeć na ekranie dostępne z historii polecenia wystarczy użyć polecenia:
history liczba.poleceń
Tak więc, jeśli chcemy obejrzeć 10 ostatnio wydanych poleceń wpiszmy history 10.
Aliasy
Aliasy są to skróty, które przyspieszają naszą pracę z powłoką. Jeśli np. codziennie uaktualniamy naszą stronę główną, której plik startowy to /home/artur/linux/index.html to zamiast ciągle wpisywać mcedit /home/artur/linux/index.html możemy utworzyć do niego alias po wywołaniu którego otworzony zostanie do edycji ten właśnie plik. Nasz alias bedzie nosił nazwę linux i właśnie to słowo będziemy musieli wpisać, aby wywołać do edycji plik index.html.
alias linux='mcedit /home/artur/linux/index.html'
Warto pamiętać, że utworzone z linii poleceń aliasy stają się nieaktualne po wylogowaniu się z powłoki. Aby były dostępne po każdym zalogowaniu się, należy je dopisać do jednego z plików konfiguracyjnych, ale o tym w dziale Dostosowywanie powłoki. Jeśli dany alias nie jest nam już potrzebny możemy usunąć go korzystając z polecenia unalias:
unalias linux
Aby wyświetlić listę wszystkich dostępnych aliasów wystarczy wydać polecenie alias, bez jakichkolwiek parametrów. Mój skonfigurowany przez ludzi z Mandrake-Soft zbiór aliasów wygląda mniej więcej tak:
alias cd..='cd ..'# Gdybym przez pomyłkę? wpisał cd.. (tak chyba jest to rozwiązane w dos`ie,alias cp='cp -i'alias mv='mv -i'alias rm='rm -i'# Gdy wydaje jedno z powyższych poleceń, zostaje ono# zamienione na polecenie z argumentem -i (interactive),# dzięki, któremu polecenie pyta się czy nadpisywać istniejące# pliki, bądź je usuwać. Służy to tylko i wyłącznie# poprawieniu bezpieczeństwa.alias rd='rmdir'alias md='mkdir'# Te aliasy zostały stworzone dla ludzi, którzy jeszcze # niedawno używali systemu DOS i są przyzwyczajeni# do poleceń tamtej powłoki.alias ls='ls --color=auto -F'alias ll='ls -l'alias lsd='ls -d */'alias la='ls -A -k'# W tym wypadku aliasy zostały stworzone, aby zbędne stało# się operowanie na parametrach polecenia ls. I tak wydanie# polecenia ls spowoduje, że dane zostaną wyświetlone w kolorkach,# oraz dodany zostanie do każdego pliku znak oznaczający jego typ.# Po wpisaniu ll zostanie wywołane polecenie ls z parametrem l,# który wyświeli nam listę plików formacie zawierającym o wiele# wiecej informacji. Pozostałe parametry musicie poszukać w# dokumentacji ls - man ls, bo artykuł ten nie ma zamiaru omawiać# poleceń, ani ich składni.alias df='df -h -x supermount'alias du='du -h'# Aliasy, powodujące, że po wydaniu poleceń df i du, programy# te będą wykonywane z odpowiednimi parametrami.alias l='ls'alias p='cd -'alias s='cd ..'alias d='ls'# Inne aliasy, skracające wpisywanie :-)
Symbole wieloznaczne
Powłoka bash obsługuje trzy rodzaje symboli wieloznaczych. Są to: *, które zastępuje dowolny znak lub ich ciąg, ? - zastępuje dowolny znak (tylko jeden!) oraz [...], które zastępuje dowolny znak występujacy pomiędzy nawisami. Symbole wieloznaczne wykorzystywane są najczęściej do wykonywania tego samego polecenia na różnych plikach, bądź katalogach. Jeśli chcemy skopiować wszystkie pliki zawarte w katalogu linux do katalogu linux-kopia wystarczy wydać polecenie:
cp linux/* linux-kopia/
Następny symbol wieloznaczny (?) zastępuje pojedynczy znak. Wydając polecenie:
cp plik?.txt linux/
spowodujemy, że zostaną skopiowane wszystkie pliki, których nazwa brzmi plik[jakiś symbol], np. plik5, pliks. Aby określić szczegółowo jakie pliki mają być kopiowane użyjemy trzecieko symbolu wieloznacznego [...]. Przypuśćmy, że w katalogu mamy pliki: plik1, plik2, plik3 i plik4. Chcemy skopiować tylko pliki z numerami 1,2 i 3. Wydajemy zatem polecenie:
Przekierowanie wejścia i wyjścia Przekierowanie wejścia służy do podania złożonych danych, które muszą być przekazane do programu. Zazwyczaj wykorzystywane jest to odczytywania danych z plików. Oto przykład:
sort < pliki_mp3# program sort ustawi w kolejności listę plików, których nazwy# zapisane zostały w pliki_mp3
Przekierowanie wyjścia jest częściej używane. Dzięki niemu będziemy mogli przesłać wyniki pochodzące od programu do pliku lub urządzenia. Potrzebne nam to będzie gdy zechcemy zapisać te wyniki do późniejszej analizy itp. Będzie je można oczywiście odczytać zwykłym edytorem tekstu. Oto dwa najprostsze przykłady przedstawiające działanie przekierowania wyjścia:
ls > lista# Spowoduje to zapisanie listy plików i katalogów w bieżącym# katalogu do pliku lista.ps -A > procesy# Spowoduje to zapisanie listy procesów do pliku procesy 7 UWAGA: Przy korzystaniu z przekierowań musimy być szczególnie uważni, gdyż w przypadku skierowania wyjścia do pliku jego poprzednia zawartość zostanie skasowana! Istnieje też możliwość dopisywania do orginalnego pliku. Wtedy jego przednia zawartość zostanie zachowana oraz uzupełniona o nowe dane. Służą do tego znaki: <<. A oto i przykład:
cat >> plikTo będzie pierwsza linia.To będzie druga linia.CTRL+D# Korzystamy z programu CAT, wpisujemy tekst i kończymy jego# działanie wciskając CTRL+Dcat >> plikTo będzie trzecia linia.To będzie czwarta linia.CTRL+D# Dopisujemy do tego pliku jeszcze dwie kolejne linie.
Nasz plik wygląda teraz:To będzie pierwsza linia.To będzie druga linia.To będzie trzecia linia.To będzie czwarta linia.
Potoki
Potoki (pipe) służą do łączenia poleceń. Dzięki temu przyspieszymy naszą pracę oraz zwiększymy możliwości prostych poleceń. Potoki wykorzystywane są najczęściej w procesach przetwarzania danych np. gdy chcemy wyszukać jakieś konkretne pliki bądź przeglądać logi systemowe, uruchomione procesy itd. Zasada działania potoków polega na tym, że wyście poprzedniego polecenia stanowi wejście następnego. Przykładowo polecenie:
najpierw wyszuka wszystkie pliki o rozszerzeniu .mp3 w katalogu /home/artur/Mp3, następnie je posortuje (tutaj wykorzystanie potoku), a na końcu wyjście programu sort zostanie skierowane do pliku moje_mp3, który będziemy mogli potem odczytać zwykłym edytorem. Zmienne
Zmienne służą do określania konfiguracji powłoki i są one dostępne dla wszystkich procesów potomnych. Wszystkie dostępne zmienne możemy wylistować poleceniem:
printenv | more
Jeśli chcemy wyeksportować jaką zmienną wydajemy polecenie według schematu:
export ZMIENNA=wartość.zmiennej
A oto i najbardziej użyteczne zmienne powłoki:
HISTFILE - określa nazwę pliku historii, [patrz: historia poleceń]HISTSIZE - rozmiar historii, [patrz: znak zachęty]EDITOR - określa domyślny edytor,PATH - ścieżka przeszukiwania, [patrz: ścieżki przeszukiwania]PS1 - znak zachety pierwszego poziomu, [patrz: znak zachęty]PS2 - znak zachety drugiego poziomu, [patrz: znak zachęty]PWD - określa nazwę bieżącego katalogu,HOSTNAME - nazwa komputera,MAIL - ścieżka gdzie przychodzą dla nas listy
Dla przykłady, żeby ustawić domyślny edytor z vi na mcedit wydaj polecenie:
export EDITOR=mcedit
Pamiętaj, że wszystkie zmienne tracą ważność po wylogowaniu się! Aby były dostępne za każdym razem musimy je dodać do plików konfiguracyjnych bash`a, ale o tym za chwilę. Znak zachęty
Znak zachęty to tekst, który informuje użytkownika, że system czeka na wprowadzenie przez niego danych. W powłoce bash istnieją dwa poziomy znaku zachęty - pierwszy, który otrzymamy zaraz po zalogowaniu informuje nas, że system czeka na wprowadzenie polecenia. Drugi poziom jest wyświetlany gdy interpreter potrzebuje dodatkowych danych, które musimy wprowadzić. Jest on przechowywany w zmiennej PS2 [patrz: zmienne powłoki] i standardowo ma postać ">". Można go zmienić, ale takie rozwiązanie jest wygodne, więc zajmiemy się tylko konfiguracją znaku zachęty pierwszego poziomu, który opisany jest w zmiennej PS1. Jeśli wydamy polcenie:
export PS1="To mój komputer"
wtedy nasz znak zachęty będzie wyglądał: To mój komputer. Nie jest to jednak rozwiązanie ani wygodne, ani estetyczne. Lepiej utworzyć znak zachęty przedstawiający dynamicznie zmieniające się dane jak na przykład czas, bieżący katalog, numer aktualnego polecenia itp.
Zerknijmy na standardową zmienną PS1. U mnie ma ona postać: PS1="[\u@\h \W]\\$ ". Przyjrzyjmy się bliżej temu co zawarte jest w cudzysłowi. Pierwszy znak [ - jest znakiem statycznym, dzięki niemu dane przedstawione są w estetycznej formie, kod \u wyświetla identyfikator użytkownika, @ to następny znak statyczny, \h pokazuje nazwę komputera, a \W wyświetla podstawową nazwę katalogu. Następnie znak ] zamyka nawias, a po nim następuje kod \$, który wyświetla znak # gdy jesteśmy zalogowani jako root, lub $ gdy jako zwykły user. Spacje są spacjami wyświetlanymi na ekranie. A teraz jak wygląda zapis PS1="[\u@\h \W]\\$ " po przetworzeniu: [root@soho /root]# lub [artur@soho /artur]$. Oto lista kodów specjalnych, które mogą zostać użyte do konfiguracji znaku zachęty:
\! - wyświetla numer polecenia historii,\# - wyświetla numer aktualnego polecenia,\$ - wyświetla # dla root`a i $ dla zwykłego użytkownika\\ - wyświetla znak \\d - wyświetla datę\t - wyświetla czas\h - wyświetla nazwę komputera\n - przechodzi do nowego wiersza\nnn - wyświetla znak, który odpowiada wartości ósemkowej nnn\s - wyświetla nazwę powłoki\u - wyświetla login użytkownika\W - wyświetla podstawową nazwę bieżącego katalogu\w - wyświetla nazwę bieżącego katalogu
Ścieżki przeszukiwania Ścieżki przeszukiwania są określone zmienną PATH i służą do wyszukania w określonej lokalizacji programu bądź polecenia. Dzięki tym ścieżką zamiast wpisywać /usr/bin/mutt by uruchomić program, wystarczy podać mutt i klient pocztowy zostanie uruchomiony. Oczywiście w zmiennej PATH musi być podana ścieżka /usr/bin. Aby zobaczyć w jakich lokalizacjach Twój Linux szuka programów wydaj polecenie printenv i poszukaj zmiennej PATH. Poszczególne ścieżki oddzielone są dwukropkiem. Zarządzanie zadaniami
Powłoka Bash oferuje możliwość uruchamiania programów w tle. Jest to przydatne wtedy gdy mamy do dyspozycji tylko jedną konsolę i wtedy program, którego wykonanie musi chwilę potrwać (np. polecenie find) zajmuję nam nasze "stanowisko pracy". Przykładowo wydajmy polecenie:
find /usr -name kde* > pliki_z_kde &
Program find uruchomi się w tle, a my na ekranie otrzymamy numer przypisanego mu procesu. Find wyszuka wszystkie pliki z /usr, których nazwa zaczyna się kde i zapisze je do pliku pliki_z_kde. Można też wysłać działający program w tło używając kombinacji klawiszy CTRL+Z, która spowoduje, że program zostanie zatrzymany, a następnie uruchomimy go w tle wpisując bgWydajemy polecenie:
find /usr -name kde* > pliki_z_kde
i wciskamy CTRL+Z. Następnie wpisujemy bg. Efekt ten sam. Aby ponownie przywrócić program na pierwszy plan skorzystajmy z polecenia fg [numer zadania]. Ponieważ dowolnie możemy korzystać z bg i fg system musi wiedzieć, na którym procesie ma operować. Jeśli pamiętamy kolejność uruchamiania programów, możemy z głowy wpisać np. fg 2, lub jeśli nie pamiętamy, zapodajemy polecenie jobs. Zostanie wyświetlona lista o wszystkich działających bądź zatrzymanych procesach wraz z ich numerem, którego potrzebowaliśmy.
Konfiguracja powłoki
Do tej pory wszelkie ustawienia, których dokonywaliśmy na powłoce stawały się nieaktualne po wylogowaniu. Można jednak ustawić je w plikach konfiguracyjnych tak by były odczytywane podczas każdego uruchamiania powłoki (logowania). W przypadku powłoki bash zmienne można umieścić (zapewne są już tam umieszczone) w plikach /etc/profile, gdy jesteśmy administratorem lub w katalogu użytkownika w pliku o nazwie .profile lub .bash_profile. Właśnie w nich dodajemy aliasy, zmienne, ścieżki itp. UWAGA: Modyfikowanie plików z katalogu /etc takich jak /etc/profile może doprowadzić do tego, że nie będziemy mogli uruchomić powłoki, dlatego bezpieczniej jest testować nowe konfiguracje jako zwykły użytkownik i zapisywać je do domowych plików konfiguracyjnych!