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ść!)