Programowanie w Shellu (index)
Zbadać zastosowanie znaków specjalnych Shella.
$ date ; ls (średnik separuje polecenia w wierszu) $ echo Kilka napisow $ echo "Kilka napisow" (ochrona spacji) $ echo "Dziesiejsza data: `date`" (cytowanie polecenia) $ echo "Dziesiejsza data: $(date)" (cytowanie polecenia) $ echo "Katalog domowy: ${HOME}" (podstawienie zmiennej) $ echo 'Katalog domowy: ${HOME}' (cytowanie napisu) $ echo Gwiazdka * $ echo Gwiazdka \* (zasłanianie specjalnego znaczenia znaku) $ echo "Gwiazdka *" $ echo "Jeden " dwa " dolar $HOME" (cytowanie znaków) $ echo "Jeden \" dwa \" dolar \$HOME" (cytowanie znaków)
Zbadać sposoby tworzenia plików tekstowych.
$ touch p1.txt (stworzenie pustego pliku) $ echo komunikat > p2.txt (przekierowanie wyjścia) $ ls > p3.txt $ vi p4.txt (użycie edytora) $ nano p4.txt $ cat > p5.txt (wpisanie z klawiatury) Pierwsza linia.[Enter] Druga linia.[Enter] [Ctrl]+[d] $ cat << EOF! > p6.txt (to można wykorzystać w skryptach) > Pierwsza linia.[Enter] > Druga linia.[Enter] > EOF![Enter]
Zbadać mechanizm przekierowania wejścia/wyjścia i tworzenia potoku na przykładzie wybranych poleceń systemu Linux.
$ ls >> dirs.txt (dopisywanie do pliku) $ cat < d1.txt > d2.txt (działa jak: cp d1.txt d2.txt) $ ls | wc -l (ls może rozpoczynać potok; otrzymujemy liczbę plików w katalogu bieżącym) $ ls | cat -n (ponumerowanie linii) $ ps xa | less (less i more mogą kończyć potok) $ ps ax | tee lista.txt | wc -l (tee rozgałęzia strumień do pliku lista.txt) $ ps ax | tee -a lista.txt | wc -l (tee dopisze do pliku) $ tty (otrzymamy nazwę pliku specjalnego związanego z naszym terminalem, czyli standardowym wyjściem) $ ps ax | tee `tty` | wc -l (tee skieruje na ekran; wykorzystane polecenie tty)
polecenie1 ; polecenie2 ; polecenie3 Średnik separuje polecenia w jednym wierszu. polecenie & Wykonaj polecenia w tle. (polecenie1; polecenie2) Grupuj standardowe wyjścia poleceń, wykonuj w podshellu. { polecenie1; polecenie2;} Wykonaj polecenia w bieżącym shellu. Ważna jest pierwsza spacja i ostatni średnik! polecenie1 | polecenie2 Potok < > Przeadresowanie wejścia/wyjścia. ${ZMIENNA} Podstaw wartość zmiennej shella. `polecenie` Podstaw wynik polecenia ze standardowego wyjścia (backquote, znak akcentu, inaczej odwrotny apostrof). $(polecenie) Podstaw wynik polecenia ze standardowego wyjścia (tylko dla bash). \ Cytowanie znaku w celu zasłonięcia specjalnego znaczenia (backslash, odwrotny ukosnik). 'cokolwiek' Cytuj wszystkie znaki w napisie (single quote, apostrof) "Napis" Cytuj wszystkie znaki w napisie, ale wykonaj pewne podstawienia (zachowuje specjalne znaczenie trzech znakow: $ wskazuje nazwę zmiennej [umożliwia podstawienie wartości zmiennej], `` znaki akcentu [umożliwia zacytowanie polecenia], \ znak maskujący) # Znak komentarza dla shella (ignoruje znaki do końca linii). polecenie1 && polecenie2 Sprawdzenie kodu powrotu i w przypadku prawdy wykonanie polecenia. polecenie1 || polecenie2 polecenie1 || { polecenie2; polecenie3;} Sprawdzenie kodu powrotu i w przypadku fauszu wykonanie polecenia.
Każdemu procesowi w Linuksie są przypisane co najmniej trzy strumienie danych:
Każdy uruchomiony w systemie proces może otworzyć jednocześnie na swoje potrzeby do dwudziestu plików. Otwarty plik proces identyfikuje poprzez przyporządkowana mu liczbę całkowitą zwaną deskryptorem pliku. Trzy liczby (0, 1, 2) są zarezerwowane i odpowiadają trzem plikom, które są zawsze otwierane w momencie utworzenia procesu:
Potok to konstrukcja złożona z wielu poleceń, w której stdout pierwszego polecenia jest dołączony do stdin drugiego polecenia, z kolei stdout drugiego polecenia jest dołączony do stdin trzeciego polecenia itd.
Filtry to polecenia, które:
prog > plik prog >> plik prog < plik_in prog <<OGR (wpisywanie do pliku z klawiatury) prog 2> plik_err prog 2>> plik_err prog > plik 2> plik_err prog > plik 2>&1 (stderr idzie tam gdzie stdout; ważna kolejność!) prog &> plik (jw) prog 2> plik 1>&2 (stdout idzie tam gdzie stderr; ważna kolejność!)