From Łukasz Graczykowski
(Difference between revisions)
|
|
(62 intermediate revisions not shown) |
Line 2: |
Line 2: |
| | __TOC__ | | | __TOC__ |
| |} | | |} |
| + | |
| + | == Zadania == |
| + | |
| + | === Zadanie 1 === |
| + | |
| + | Za pomocą polecenia <code>echo</code> wyświetlić wszystkie pliki kończące się na <code>.conf</code> z katalogu <code>/etc</code> |
| + | |
| + | === Zadanie 2 === |
| + | |
| + | Proszę pobrać tekst Romeo i Julii po angielsku ze strony: http://www.gutenberg.org/cache/epub/1112/pg1112.txt |
| + | |
| + | Po kolei należy: |
| + | # Wypisać linie zawierające słowo Juliet. |
| + | # Wypisać linie zawierające słowo Juliet z numerami linii. |
| + | # Wypisać linie zawierające na raz słowa Juliet i Romeo oraz zapisać do pliku. |
| + | |
| + | === Zadanie 3=== |
| + | Proszę uruchomić edytor tekstu pluma, wstrzymać go, a następnie wznowić jego proces. |
| + | |
| + | === Zadanie 4 === |
| + | Proszę ustawić zmienną <code>PATH</code> na pusty ciąg znaków i sprawdzić jakie polecenia działają z następującej listy: <code>cd</code>, <code>pwd</code>, <code>ls</code>, <code>cat</code>, <code>grep</code> |
| + | |
| + | === Zadanie 5 === |
| + | Napisać skrypt, który wypisze 3 linijki: |
| + | |
| + | * Ścieżka do Twojego katalogu domowego (np. <code>/home/foo</code>) (skorzystać z odpowiedniej zmiennej środowiskowej) |
| + | * <code>${HOME}</code> (w konsoli ma się pojawić dokładnie taki napis) |
| + | * aktualna data to: pon, 9 mar 2015, 17:47:38 CET (skorzystać z polecenia <code>date</code>) |
| + | |
| + | === Zadanie 6 === |
| + | Napisać skrypt (i uruchomić z 3. dowolnymi argumentami), który: |
| + | |
| + | # wypisze liczbę argumentów skryptu |
| + | # wypisze drugi argument |
| + | # wypisze wszystkie dostępne zmienne środowiskowe, które w swojej wartości zawierają Państwa nazwę użytkownika (użyć zmiennej $USER) |
| + | |
| + | === Zadanie 7 === |
| + | Napisać skrypt, który: |
| + | |
| + | # sprawdzi czy istnieje plik <code>~/.xsession-errors</code> i wypisze odpowiednią informację |
| + | # porówna liczbę plików w katalogu głównym oraz domowym i wypisze odpowiednią informację |
| + | |
| + | === Zadanie 8 === |
| + | Napisz funkcję, która liczy silnię jej argumentu, wykonaj ją dla liczb od 1 do 15. |
| + | |
| + | === Projekt 1 === |
| + | Dostępne tematy można znaleźć [http://db.fizyka.pw.edu.pl/sk-2015/zaj2/prace.html tutaj]. |
| | | |
| == Powłoka Bash == | | == Powłoka Bash == |
Line 44: |
Line 91: |
| | | |
| cat nazwa_pliku | | cat nazwa_pliku |
| + | |
| + | * '''grep''' |
| + | Służy do wyszukiwania w tekście i wyodrębniania linii zawierających ciąg znaków pasujący do podanego wyrażenia. |
| + | grep opcje wzorzec plik |
| | | |
| * '''Przekierownia > i >>''' | | * '''Przekierownia > i >>''' |
Line 56: |
Line 107: |
| polecenieA | polecenieB | | polecenieA | polecenieB |
| | | |
- | *tail | + | *'''tail''' |
| | | |
- | Program tail okazuje koncówkę pliku | + | Program <code>tail</code> okazuje koncówkę pliku |
| cat /usr/share/romeo | tail -n 100 | | cat /usr/share/romeo | tail -n 100 |
| | | |
- | *head | + | *'''head''' |
| | | |
- | Program head pokazuje początek pliku | + | Program <code>head</code> pokazuje początek pliku |
| | | |
| * '''Strumienie wyjściowe.''' Każdy program ma podłączone dwa standardowe strumienie wyjściowe: | | * '''Strumienie wyjściowe.''' Każdy program ma podłączone dwa standardowe strumienie wyjściowe: |
Line 110: |
Line 161: |
| * Wymuszenie wyłączenia procesu | | * Wymuszenie wyłączenia procesu |
| * Zatrzymanie wykonania procesu | | * Zatrzymanie wykonania procesu |
- | * Do wysyłania sygnałów służą polecenia oraz pkill, kill. | + | * Do wysyłania sygnałów służą polecenia oraz <code>pkill</code>, <code>kill</code>. |
| | | |
- | Polecenie '''kill''' przyjmuje id procesu, polecenie ''''pkill''' wysyła sygnał do procesów, których nazwa zawiera ciąg znaków podanych w tym poleceniu. | + | Polecenie '''kill''' przyjmuje id procesu, polecenie '''pkill''' wysyła sygnał do procesów, których nazwa zawiera ciąg znaków podanych w tym poleceniu. |
| | | |
| jb /tmp/bar $ ps -e | grep iceweasel | | jb /tmp/bar $ ps -e | grep iceweasel |
Line 127: |
Line 178: |
| | | |
| == Zadanie 3== | | == Zadanie 3== |
- | Proszę uruchomić przeglądarkę firefox, wstrzymać ją, a następnie wznowić jej proces. | + | Proszę uruchomić edytor tekstu pluma, wstrzymać go, a następnie wznowić jego proces. |
| | | |
| == Zmienne w Bash == | | == Zmienne w Bash == |
Line 138: |
Line 189: |
| bar | | bar |
| | | |
- | Uwaga: Białe znaki mają znaczenie: tj. poniższy kod jest niepoprawny: foo = "bar"
| + | Czyli by ustawić zmienną, podajemy jej nazwę po której następuje znak "=" a następnie wartość. By odczytać zmienną, musimy użyć jej nazwy poprzedzonej znakiem '''$'''. |
| | | |
- | Export powoduje, że zmienne są dostępne dla podprocesów. | + | Uwaga: Białe znaki mają znaczenie: tj. poniższy kod jest niepoprawny: <code>foo = "bar"</code> |
| + | |
| + | Export powoduje, że zmienne są dostępne również dla podprocesów (czyli np. drugi terminal uruchomiony poleceniem z pierwszego terminala). |
| | | |
| export foo="bar"; | | export foo="bar"; |
Line 150: |
Line 203: |
| | | |
| == Zmienna path == | | == Zmienna path == |
- | Zmienna path jest magiczną zmienną powłoki BASH, pozwala ona na zdefiniowanie w jakich katalogach bash szuka plików wykonywalnych. | + | Zmienna '''$PATH''' jest magiczną zmienną powłoki BASH, pozwala ona na zdefiniowanie w jakich katalogach bash szuka plików wykonywalnych. |
| + | |
| + | <codE>'''Note:''' Zmienna '''$PATH''' określa listę katalogów, które będą przeszukiwane podczas uruchamiania programu.</code> |
| + | |
| + | Jeśli '''$PATH''' to '''/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games''' oznacza to, że po wykonaniu polecenia np. nano zostaną przeszukane takie położenia: '''/usr/local/bin/nano''', '''/usr/bin/nano'''. itp. |
| | | |
- | Note Zmienna $PATH określa listę katalogów, które będą przeszukiwane podczas uruchamiania programu.
| + | Wszystkie zmienne środowiskowe można wyświetlić za pomocą polecenia '''printenv'''. |
- | Jeśli $PATH to /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games oznacza to, że po wykonaniu polecenia np. nano zostaną przeszukane takie położenia: /usr/local/bin/nano, /usr/bin/nano. itp.
| + | |
- | Wszystkie zmienne środowiskowe można wyświetlić za pomocą polecenia printenv. | + | |
| | | |
| == Zadanie 4 == | | == Zadanie 4 == |
- | Proszę ustawić zmienną PATH na pusty ciąg znaków i sprawdzić jakie polecenia działają. | + | Proszę ustawić zmienną <code>PATH</code> na pusty ciąg znaków i sprawdzić jakie polecenia działają. |
| | | |
| Czy działa: | | Czy działa: |
| | | |
- | * cd | + | * <code>cd</code> |
- | * pwd | + | * <code>pwd</code> |
- | * ls | + | * <code>ls</code> |
- | * cat | + | * <code>cat</code> |
- | * grep | + | * <code>grep</code> |
| Polecenia, które działają są wbudowanymi poleceniami powłoki bash, pozstałe są programami. | | Polecenia, które działają są wbudowanymi poleceniami powłoki bash, pozstałe są programami. |
| | | |
| == Cytowanie == | | == Cytowanie == |
- | Powiedzmy, że mamy katalog o nazwie Moje Dokumenty, który znajduje się w bieżącym katalogu. Chcemy go usunąć, jednak nie udaje się to: | + | Powiedzmy, że mamy katalog o nazwie <code>Moje Dokumenty</code>, który znajduje się w bieżącym katalogu. Chcemy go usunąć, jednak nie udaje się to: |
| | | |
- | rm Moje Dokumenty | + | rm Moje Dokumenty |
- | rm: cannot remove ‘Moje’: No such file or directory | + | rm: cannot remove ‘Moje’: No such file or directory |
- | rm: cannot remove ‘Dokumenty’: No such file or directory | + | rm: cannot remove ‘Dokumenty’: No such file or directory |
- | Okazuje się, że bash potraktował Moje Dokumenty jako dwa katalogi, jeden o nazwie Moje, drugi o nazwie Dokumenty. | + | Okazuje się, że bash potraktował <code>Moje Dokumenty</code> jako dwa katalogi, jeden o nazwie Moje, drugi o nazwie Dokumenty. |
| | | |
- | By usunąć ten plik należy użyć cytowania, czyli powiedzieć bashowi: ten ciąg znaków ze spacją jest jednym słowem, służą do tego podwójne cudzysłowy. | + | By usunąć ten folder należy użyć cytowania, czyli powiedzieć bashowi: ten ciąg znaków ze spacją jest jednym słowem, służą do tego podwójne cudzysłowy. |
| | | |
| Taka komenda zadziała: | | Taka komenda zadziała: |
| | | |
- | rm "Moje Dokumenty" | + | rm "Moje Dokumenty" |
- | Powiedzmy, że nasz skrypt chce wyświetlić użytkownikowi napis: Dodaj katalog foo do zmiennej ${PATH}. | + | Powiedzmy, że nasz skrypt chce wyświetlić użytkownikowi napis: <code>Dodaj katalog foo do zmiennej ${PATH}</code>. |
| | | |
| Polecenie: | | Polecenie: |
| | | |
- | echo "Dodaj katalog foo do zmiennej ${PATH}" | + | echo "Dodaj katalog foo do zmiennej ${PATH}" |
| wyświetli: | | wyświetli: |
| | | |
- | Dodaj katalog foo do zmiennej /usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games | + | Dodaj katalog foo do zmiennej /usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games |
| Znów musimy zacytować nasz ciąg znaków, ale tym razem trzeba użyć pojedyńczego apostrofu: | | Znów musimy zacytować nasz ciąg znaków, ale tym razem trzeba użyć pojedyńczego apostrofu: |
| | | |
- | echo 'Dodaj katalog foo do zmiennej ${PATH}' | + | echo 'Dodaj katalog foo do zmiennej ${PATH}' |
| Wyświetla: | | Wyświetla: |
| | | |
- | Dodaj katalog foo do zmiennej ${PATH} | + | Dodaj katalog foo do zmiennej ${PATH} |
| | | |
- | == Linia hashbang == | + | == Linia hashbang <code>#!/bin/bash</code> == |
| Skrypty bash mogą być uruchamiane tak samo jak zwykłe programy, o ile: | | Skrypty bash mogą być uruchamiane tak samo jak zwykłe programy, o ile: |
| | | |
- | nadano im uprawnienia do wykonywania chmod +x nazwa.sh | + | * nadano im uprawnienia do wykonywania '''chmod +x nazwa.sh''' |
- | rozpoczynają się od linii hashbang, czyli od: #!/bin/bash, w linii tej po znakach #! znajduje się pełna ścieżka do interpretera, który wykona ów program. | + | * rozpoczynają się od linii hashbang, czyli od: '''#!/bin/bash''', w linii tej po znakach #! znajduje się pełna ścieżka do interpretera, który wykona ów program. |
- | Przykład najprostszego skryptu:
| + | |
| | | |
| + | Przykład najprostszego skryptu: |
| #!/bin/bash | | #!/bin/bash |
| echo hello ze skryptu | | echo hello ze skryptu |
Line 209: |
Line 264: |
| Napisać skrypt, który wypisze 3 linijki: | | Napisać skrypt, który wypisze 3 linijki: |
| | | |
- | Ścieżka do Twojego katalogu domowego (np. /home/foo) (skorzystać z odpowiedniej zmiennej środowiskowej) | + | * Ścieżka do Twojego katalogu domowego (np. <code>/home/foo</code>) (skorzystać z odpowiedniej zmiennej środowiskowej) |
- | ${HOME} (w konsoli ma się pojawić dokładnie taki napis) | + | * <code>${HOME}</code> (w konsoli ma się pojawić dokładnie taki napis) |
- | aktualna data to: pon, 9 mar 2015, 17:47:38 CET (skorzystać z polecenia date) | + | * Następujący tekst (skorzystać z polecenia <code>date</code>): |
- | | + | aktualna data to: |
- | | + | pon, 9 mar 2015, 17:47:38 CET |
| == Zapisywanie wyniku polecenia w zmiennej == | | == Zapisywanie wyniku polecenia w zmiennej == |
| Czasem chcemy zapisać wynik polecenia do zmiennej, np. polecenie date wyświetla do wyświetlania daty służy polecenie date: | | Czasem chcemy zapisać wynik polecenia do zmiennej, np. polecenie date wyświetla do wyświetlania daty służy polecenie date: |
| | | |
- | date +%Y-%m-%d | + | date +%Y-%m-%d |
| wyświetla: | | wyświetla: |
| | | |
- | 2015-10-05 | + | 2015-10-05 |
| Chcemy stworzyć plik o nazwie kopia-zapasowa-data: | | Chcemy stworzyć plik o nazwie kopia-zapasowa-data: |
| | | |
- | curr_date=$(date +%Y-%m-%d) | + | curr_date=$(date +%Y-%m-%d) |
- | file_name="kopia-zapasowa-${curr_date}" | + | file_name="kopia-zapasowa-${curr_date}" |
- | echo > $file_name | + | echo > $file_name |
| można to zrobić prościej: | | można to zrobić prościej: |
| | | |
- | touch "kopia-zapasowa-$(date +%Y-%m-%d)" | + | touch "kopia-zapasowa-$(date +%Y-%m-%d)" |
- | Note Uwaga! Działanie $() można osiągnść również poprzez zastosowanie odwróconych cudzysłowów (`), tj: | + | '''Note:''' Uwaga! Działanie '''$()''' można osiągnść również poprzez zastosowanie odwróconych cudzysłowów (`), tj: |
- | touch "kopia-zapasowa-`date +%Y-%m-%d`" | + | touch "kopia-zapasowa-`date +%Y-%m-%d`" |
- | Jednak by oszczędzić Wam problemów z , ‘ oraz ”, będę wykorzystywał ``$()`. | + | Jednak by oszczędzić Wam problemów z , ‘ oraz ”, na zajęciach będzie wykorzystywane zawsze ``$()`. |
| | | |
| ==Specjalne zmienne== | | ==Specjalne zmienne== |
Line 241: |
Line 296: |
| * $@ wszystkie argumenty na raz | | * $@ wszystkie argumenty na raz |
| | | |
- | == Zadanie 7 == | + | == Zadanie 6 == |
| Napisać skrypt (i uruchomić z 3. dowolnymi argumentami), który: | | Napisać skrypt (i uruchomić z 3. dowolnymi argumentami), który: |
| | | |
| # wypisze liczbę argumentów skryptu | | # wypisze liczbę argumentów skryptu |
| # wypisze drugi argument | | # wypisze drugi argument |
- | # wypisze wszystkie dostępne zmienne środowiskowe, które w swojej wartości zawierają Państwa nazwę użytkownika (użyć zmiennej $USER) | + | # wypisze wszystkie dostępne zmienne środowiskowe, które w swojej wartości zawierają Państwa nazwę użytkownika (użyć zmiennej <code>$USER</code>) |
| | | |
| == Instrukcje warunkowe == | | == Instrukcje warunkowe == |
| Wykonanie każdego programu może skończyć się albo sukcesem, albo porażką, do syngalizowania sukcesu lub porażki służy tzw. kod wyjścia. | | Wykonanie każdego programu może skończyć się albo sukcesem, albo porażką, do syngalizowania sukcesu lub porażki służy tzw. kod wyjścia. |
| | | |
- | Note W C kod wyjścia programu jest sygnalizowani (między innymi) wartością zwracaną przez funkcję main. | + | '''Note:''' W C kod wyjścia programu jest sygnalizowani (między innymi) wartością zwracaną przez funkcję main. |
| Jeśli program wykonmał się poprawnie funkcja zwraca 0, jeśli nie poprawnie inną wartość. | | Jeśli program wykonmał się poprawnie funkcja zwraca 0, jeśli nie poprawnie inną wartość. |
| | | |
- | Note Jest to notacja odwrotna od tej stosowanej w C, tam 0 oznacza fałsz, a 1 prawdę. | + | '''Note:''' Jest to notacja odwrotna od tej stosowanej w C, tam 0 oznacza fałsz, a 1 prawdę. |
| Powód takiej notacji w jest prosty: Program może poprawnie się wykoanć tylko w jeden sposób, może natomiast napotkać na wiele problemów, które spowodują błędne wykonanie. | | Powód takiej notacji w jest prosty: Program może poprawnie się wykoanć tylko w jeden sposób, może natomiast napotkać na wiele problemów, które spowodują błędne wykonanie. |
| + | |
| Do sprawdzenia kodu wyjścia ostatniego polecenia można użyć magicznej zmiennej $?. | | Do sprawdzenia kodu wyjścia ostatniego polecenia można użyć magicznej zmiennej $?. |
| | | |
Line 267: |
Line 323: |
| Przykładowo by sprawdzić czy foo jest nazwą użytkownika można użyć: | | Przykładowo by sprawdzić czy foo jest nazwą użytkownika można użyć: |
| | | |
- | <code>if grep foo</code> <code>/etc/passwd</code> > <code>/dev/null</code>
| + | if grep foo /etc/ passwd > /dev/null |
| then | | then |
| echo "Jest" | | echo "Jest" |
| fi | | fi |
| | | |
- | Note Uwaga zastosowałem tu nową składnię polecenia grep jest to składnia grep wzorzec nazwa pliku oraz przekierowałem wyjście z grep do pliku <code>/dev/null</code>. | + | '''Note:''' Uwaga została zastosowana tu nowa składnia polecenia grep jest to składnia '''grep wzorzec nazwa pliku''' oraz wyjście z grep zostało przekierowane do pliku <code>/dev/null</code>. |
| | | |
| Pełna składnia if jest taka: | | Pełna składnia if jest taka: |
- |
| |
| | | |
| if warunek1 | | if warunek1 |
Line 307: |
Line 362: |
| Uwaga: między [ oraz ], a warunkiem musi znajdować się przynajmniej jedna spacja. | | Uwaga: między [ oraz ], a warunkiem musi znajdować się przynajmniej jedna spacja. |
| | | |
- | == Zadanie 8 == | + | == Zadanie 7 == |
| Napisać skrypt, który: | | Napisać skrypt, który: |
| | | |
- | sprawdzi czy istnieje plik <code>~/.xsession-errors</code> i wypisze odpowiednią informację | + | # sprawdzi czy istnieje plik <code>~/.xsession-errors</code> i wypisze odpowiednią informację |
| + | # porówna liczbę plików w katalogu głównym oraz domowym i wypisze odpowiednią informację |
| | | |
- | porówna liczbę plików w katalogu głównym oraz domowym i wypisze odpowiednią informację
| + | '''Note:''' Polecam program '''wc''' (proszę przeczytać <code>man wc</code>) |
| | | |
- | Note Polecam program wc (proszę przeczytać man wc)
| + | == Obliczenia arytmetyczne == |
- | Obliczenia arytmetyczne | + | Do obliczeń arytmetycznych służy funkcja '''let''': |
- | Do obliczeń arytmetycznych służy funkcja let: | + | |
| | | |
| let x=10 | | let x=10 |
Line 324: |
Line 379: |
| let "x *= x" | | let "x *= x" |
| echo $x # wypisze 9 | | echo $x # wypisze 9 |
- | Warning Bash może wspierać tylko arytmetykę stałoprzecinkową, dla której 10/3 wynosi dokładnie 3. | + | '''Warning''' Bash może wspierać tylko arytmetykę stałoprzecinkową, dla której 10/3 wynosi dokładnie 3. |
- | Warning Przy wykonywaniu operacji należy umieszczać spacje wokół operatora =. | + | |
| + | '''Warning''' Przy wykonywaniu operacji należy umieszczać spacje wokół operatora =. |
| | | |
| ==Funkcje== | | ==Funkcje== |
Line 345: |
Line 401: |
| | | |
| == Pętle == | | == Pętle == |
- | Pętla for pozwala na iterowanie po zbiorze elementów separowanych spacją: | + | '''Pętla for''' pozwala na iterowanie po zbiorze elementów separowanych spacją: |
| | | |
| for i in a b c d | | for i in a b c d |
Line 356: |
Line 412: |
| echo "$i" | | echo "$i" |
| done | | done |
- | Note Można skonfigurować basha tak, by separatorem był inny znak, ale poprzestańmy na spacji. | + | '''Note:''' Można skonfigurować basha tak, by separatorem był inny znak, ale poprzestańmy na spacji. |
- | while - sprawdza, czy warunek jest prawdziwy, jeśli tak, pętla wykonuje się, aż warunek stanie się fałszywy: | + | |
| + | '''while''' - sprawdza, czy warunek jest prawdziwy, jeśli tak, pętla wykonuje się, aż warunek stanie się fałszywy: |
| | | |
| a=0 | | a=0 |
Line 365: |
Line 422: |
| a=$[a + 1] # lub a=$(( $a + 1 )) | | a=$[a + 1] # lub a=$(( $a + 1 )) |
| done | | done |
- | until - sprawdza, czy warunek jest fałszywy, jeśli tak, pętla wykonuje się aż warunek stanie się prawdziwy: | + | '''until''' - sprawdza, czy warunek jest fałszywy, jeśli tak, pętla wykonuje się aż warunek stanie się prawdziwy: |
| | | |
| a=0 | | a=0 |
Line 374: |
Line 431: |
| done | | done |
| | | |
- | == Zadanie 9 == | + | == Zadanie 8 == |
| Napisz funkcję, która liczy silnię jej argumentu, wykonaj ją dla liczb od 1 do 15. | | Napisz funkcję, która liczy silnię jej argumentu, wykonaj ją dla liczb od 1 do 15. |
| + | |
| + | |
| + | == Polecenia, które trzeba znać == |
| + | Wszystkie, które pojawiły się podczas tego laboratorium, oraz: |
| + | * <code>cp</code> |
| + | * <code>mv</code> |
| + | * <code>mkdir</code> |
| + | * <code>touch</code> |
| + | * <code>ssh</code> |
| + | * <code>scp</code> |
| + | * <code>more</code> |
| + | * <code>ls</code>, <code>ls -a</code>, <code>ls -h</code>, <code>ls -t</code>, <code>ls -l</code>, <code>ls -r</code> |
| + | * <code>rm</code> |
| + | * <code>grep</code> |
| + | * <code>pwd</code> |
| + | * <code>find</code> |
| + | * <code>ps</code> |
| + | * <code>top</code> |
| + | * <code>ping</code> |
| + | * <code>wget</code> |
| + | * <code>cat</code> |
| + | Więcej informacji można znaleźć [http://www.if.pw.edu.pl/~lgraczyk/sk/html/zaj2.html tutaj], na dole strony. |
| + | |
| + | == Projekt 1 == |
| + | Projekty realizowane są pojedynczo. Z projektu można uzyskać maksymalnie 15 punktów. Dostępne tematy można znaleźć [https://www.if.pw.edu.pl/~lgraczyk/sk/html/zaj2/prace.html tutaj]. |
| | | |
| == Zadania i informacje dodatkowe == | | == Zadania i informacje dodatkowe == |
Line 381: |
Line 463: |
| Proszę wylistować użytkowników z pliku <code>/etc/passwd</code> za pomocą polecenia <code>cut</code>. | | Proszę wylistować użytkowników z pliku <code>/etc/passwd</code> za pomocą polecenia <code>cut</code>. |
| | | |
- | '''Note''' Polecenie <code>cut</code> służy do wypisywania wybranych części (elementów) linii z pliku tekstowego. W naszym przypadku używamy to polecenie z opcją -d :, która powoduje, że linie dzielone są na części odseparowane od siebie znakiem :. Użycie opcji -f 1 wybiera 1 część (z 2 drugą część, itd.) | + | '''Note''' Polecenie <code>cut</code> służy do wypisywania wybranych części (elementów) linii z pliku tekstowego. W naszym przypadku używamy to polecenie z opcją <code>-d :</code>, która powoduje, że linie dzielone są na części odseparowane od siebie znakiem :. Użycie opcji <code>-f 1</code> wybiera 1 część (z 2 drugą część, itd.) |
Latest revision as of 09:10, 3 November 2023
Zadania
Zadanie 1
Za pomocą polecenia echo
wyświetlić wszystkie pliki kończące się na .conf
z katalogu /etc
Zadanie 2
Proszę pobrać tekst Romeo i Julii po angielsku ze strony: http://www.gutenberg.org/cache/epub/1112/pg1112.txt
Po kolei należy:
- Wypisać linie zawierające słowo Juliet.
- Wypisać linie zawierające słowo Juliet z numerami linii.
- Wypisać linie zawierające na raz słowa Juliet i Romeo oraz zapisać do pliku.
Zadanie 3
Proszę uruchomić edytor tekstu pluma, wstrzymać go, a następnie wznowić jego proces.
Zadanie 4
Proszę ustawić zmienną PATH
na pusty ciąg znaków i sprawdzić jakie polecenia działają z następującej listy: cd
, pwd
, ls
, cat
, grep
Zadanie 5
Napisać skrypt, który wypisze 3 linijki:
- Ścieżka do Twojego katalogu domowego (np.
/home/foo
) (skorzystać z odpowiedniej zmiennej środowiskowej)
-
${HOME}
(w konsoli ma się pojawić dokładnie taki napis)
- aktualna data to: pon, 9 mar 2015, 17:47:38 CET (skorzystać z polecenia
date
)
Zadanie 6
Napisać skrypt (i uruchomić z 3. dowolnymi argumentami), który:
- wypisze liczbę argumentów skryptu
- wypisze drugi argument
- wypisze wszystkie dostępne zmienne środowiskowe, które w swojej wartości zawierają Państwa nazwę użytkownika (użyć zmiennej $USER)
Zadanie 7
Napisać skrypt, który:
- sprawdzi czy istnieje plik
~/.xsession-errors
i wypisze odpowiednią informację
- porówna liczbę plików w katalogu głównym oraz domowym i wypisze odpowiednią informację
Zadanie 8
Napisz funkcję, która liczy silnię jej argumentu, wykonaj ją dla liczb od 1 do 15.
Projekt 1
Dostępne tematy można znaleźć tutaj.
Powłoka Bash
Bash jest jedną z powłok systemowych, czyli programów, które pośredniczą między systemem operacyjnym a użytkownikiem. Użytkownik za pomocą powłoki uruchamia programy, jak i programy zwracają do powłoki wynik swojego działania, który następnie jest przekazywany użytkownikowi. Programy mogą komunikować sie z użytkownikiem również niezależnie (np. programy okienkowe).
Każda powłoka zawiera polecenia, które wykonują podstawowe operacje w systemie operacyjnym (np. tworzenie folderów). Paletę domyślnych poleceń wzbogacają zewnętrzne programy, które wykonują operacje nie będące zawartymi poleceniami.
Praktycznie każda dystrybucja Linuxa (z Androidem włącznie) zawiera powłokę Bash.
Powłoka Bash: Podstawy
Jednym z podstawowych poleceń jest echo
, służące do wyświetlania tekstu podanego mu jako argument:
echo foo
foo
W poleceniu echo możemy również stosować tzw. metaznaki. Przykładem takiego znaku jest *
:
cd /
echo *
bin boot dev etc home initrd.img initrd.img.old lib lib32 lib64 lost+found media mnt opt optl proc root run sbin selinux srv sys tmp usr var vmlinuz vmlinuz.old
echo b*
bin boot
W powyższym przykładzie widzimy, że Bash rozwija znak *
zastępując go dowolnym ciągiem znaków.
Innym przykładem metaznaku jest ~
, który zastępuje katalog domowy.
echo ~
/home/jb
Zadanie 1
Za pomocą polecenia echo
wyświetlić wszystkie pliki kończące się na .conf
z katalogu /etc
Powłoka Bash: Przekierowania i Potoki
Program cat
odczytuje zawartość plików i przekierowuje ją na standardowe wyjście:
cat nazwa_pliku
Służy do wyszukiwania w tekście i wyodrębniania linii zawierających ciąg znaków pasujący do podanego wyrażenia.
grep opcje wzorzec plik
By przekierować standardowe wyjście programu do pliku należy użyć operatora >
lub >>
.
cat plik1 plik2 >> polaczonepliki
W wariancie z >
polecenie to spowoduje nadpisanie pliku zawartością standardowego wyjścia, w wariancie >>
spowoduje dopisanie treści na końcu pliku.
- Mechanizm potoku (ang. pipe)
Załóżmy, że mamy dwa polecenia: polecenieB
i polecenieB
i chcemy, aby polecenieB
na swoje standardowe wejście przyjęło wynik działania polecenieA
. W takim przypadku należy wpisać:
polecenieA | polecenieB
Program tail
okazuje koncówkę pliku
cat /usr/share/romeo | tail -n 100
Program head
pokazuje początek pliku
- Strumienie wyjściowe. Każdy program ma podłączone dwa standardowe strumienie wyjściowe:
- Standardowe wyjście
- Standardowy strumień błędów
Rozróżnienie wynika z tego, aby wynik działania programu mógł być zwracany przez jeden strumień (np. polecenie tar zwróci spakowany folder), a informacje o ewentualnych błędach przez inny strumień.
By przekierować standardowy strumień błędów należy użyć 2>
lub 2>>
.
- Zapisuje wynik działania do pliku:
>
- Dodaje wynik działania do pliku:
>>
- Przekierowuje strumień błędów:
2>
- Przesyła wynik działania (ang. output) programu na wejście (ang. input) drugiego programu:
|
Więcej informacji: http://ryanstutorials.net/.
Zadanie 2
Proszę pobrać tekst Romeo i Julii po angielsku pg1112.txt
wget http://www.gutenberg.org/cache/epub/1112/pg1112.txt
Po kolei należy:
- Wypisać linie zawierające słowo Juliet.
- Wypisać linie zawierające słowo Juliet z numerami linii.
- Wypisać linie zawierające na raz słowa Juliet i Romeo oraz zapisać do pliku.
Pliki specjalne
Plik /dev/null
to plik, który przyjmuje dowolne dane, które potem znikają.
Jest on przydatny kiedy chcemy się pozbyć jakiegoś strumienia danych (np. komunikatów o błędach).
polecenie 2> /dev/null
Plik /dev/random
oraz /dev/urandom
zawierają nieskończone ciągi losowych liczb.
Taka komenda pozwala na wpipsanie kilku losowych znaków:
cat /dev/urandom | head -c 66 | base64
Sygnały
Sygnały są metodą na komunikację między procesami w systemach Linux’owych. Pozwalają, na przykład, na:
- Poproszenie procesu o wyłączenie się
- Wymuszenie wyłączenia procesu
- Zatrzymanie wykonania procesu
- Do wysyłania sygnałów służą polecenia oraz
pkill
, kill
.
Polecenie kill przyjmuje id procesu, polecenie pkill wysyła sygnał do procesów, których nazwa zawiera ciąg znaków podanych w tym poleceniu.
jb /tmp/bar $ ps -e | grep iceweasel
5020 ? 00:13:16 iceweasel
kill 5020
To samo zadanie wykona:
pkill iceweasel
Domyślnie pkill i kill wysyłają sygnał TERM, który prosi proces by ten się wyłączył (proces może się na to nie zgodzić).
Polecenia pkill -9 oraz kill -9 pozwalają na zabicie procesu (proces zawsze się wyłączy).
Polecenie 'pkill --signal SIGSTOP spowoduje wstrzymanie wykonania procesu, a 'pkill --signal SIGCONT' włączy go ponownie.
Zadanie 3
Proszę uruchomić edytor tekstu pluma, wstrzymać go, a następnie wznowić jego proces.
Zmienne w Bash
W Bash’u można również tworzyć zmienne.
jb@gautama:/$ foo="bar";
jb@gautama:/$ echo $foo;
bar
jb@gautama:/$ echo ${foo}; #Równoważne do $foo
bar
Czyli by ustawić zmienną, podajemy jej nazwę po której następuje znak "=" a następnie wartość. By odczytać zmienną, musimy użyć jej nazwy poprzedzonej znakiem $.
Uwaga: Białe znaki mają znaczenie: tj. poniższy kod jest niepoprawny: foo = "bar"
Export powoduje, że zmienne są dostępne również dla podprocesów (czyli np. drugi terminal uruchomiony poleceniem z pierwszego terminala).
export foo="bar";
Nie ma możliwości udostępnienia zmiennych dla nadprocesów.
By ustawić zmienne środowiskowe ‘na stałe’ należy umieścić odpowiednie polecenia export w plikach:
- /etc/bash.bashrc wtedy zmienne będą widoczne dla wszystkich użytkowników
- ~/.bashrc wtedy będą widoczne dla danego użytkownika.
Zmienna path
Zmienna $PATH jest magiczną zmienną powłoki BASH, pozwala ona na zdefiniowanie w jakich katalogach bash szuka plików wykonywalnych.
Note: Zmienna $PATH określa listę katalogów, które będą przeszukiwane podczas uruchamiania programu.
Jeśli $PATH to /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games oznacza to, że po wykonaniu polecenia np. nano zostaną przeszukane takie położenia: /usr/local/bin/nano, /usr/bin/nano. itp.
Wszystkie zmienne środowiskowe można wyświetlić za pomocą polecenia printenv.
Zadanie 4
Proszę ustawić zmienną PATH
na pusty ciąg znaków i sprawdzić jakie polecenia działają.
Czy działa:
Polecenia, które działają są wbudowanymi poleceniami powłoki bash, pozstałe są programami.
Cytowanie
Powiedzmy, że mamy katalog o nazwie Moje Dokumenty
, który znajduje się w bieżącym katalogu. Chcemy go usunąć, jednak nie udaje się to:
rm Moje Dokumenty
rm: cannot remove ‘Moje’: No such file or directory
rm: cannot remove ‘Dokumenty’: No such file or directory
Okazuje się, że bash potraktował Moje Dokumenty
jako dwa katalogi, jeden o nazwie Moje, drugi o nazwie Dokumenty.
By usunąć ten folder należy użyć cytowania, czyli powiedzieć bashowi: ten ciąg znaków ze spacją jest jednym słowem, służą do tego podwójne cudzysłowy.
Taka komenda zadziała:
rm "Moje Dokumenty"
Powiedzmy, że nasz skrypt chce wyświetlić użytkownikowi napis: Dodaj katalog foo do zmiennej ${PATH}
.
Polecenie:
echo "Dodaj katalog foo do zmiennej ${PATH}"
wyświetli:
Dodaj katalog foo do zmiennej /usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Znów musimy zacytować nasz ciąg znaków, ale tym razem trzeba użyć pojedyńczego apostrofu:
echo 'Dodaj katalog foo do zmiennej ${PATH}'
Wyświetla:
Dodaj katalog foo do zmiennej ${PATH}
Linia hashbang #!/bin/bash
Skrypty bash mogą być uruchamiane tak samo jak zwykłe programy, o ile:
- nadano im uprawnienia do wykonywania chmod +x nazwa.sh
- rozpoczynają się od linii hashbang, czyli od: #!/bin/bash, w linii tej po znakach #! znajduje się pełna ścieżka do interpretera, który wykona ów program.
Przykład najprostszego skryptu:
#!/bin/bash
echo hello ze skryptu
Zadanie 5
Napisać skrypt, który wypisze 3 linijki:
- Ścieżka do Twojego katalogu domowego (np.
/home/foo
) (skorzystać z odpowiedniej zmiennej środowiskowej)
-
${HOME}
(w konsoli ma się pojawić dokładnie taki napis)
- Następujący tekst (skorzystać z polecenia
date
):
aktualna data to:
pon, 9 mar 2015, 17:47:38 CET
Zapisywanie wyniku polecenia w zmiennej
Czasem chcemy zapisać wynik polecenia do zmiennej, np. polecenie date wyświetla do wyświetlania daty służy polecenie date:
date +%Y-%m-%d
wyświetla:
2015-10-05
Chcemy stworzyć plik o nazwie kopia-zapasowa-data:
curr_date=$(date +%Y-%m-%d)
file_name="kopia-zapasowa-${curr_date}"
echo > $file_name
można to zrobić prościej:
touch "kopia-zapasowa-$(date +%Y-%m-%d)"
Note: Uwaga! Działanie $() można osiągnść również poprzez zastosowanie odwróconych cudzysłowów (`), tj:
touch "kopia-zapasowa-`date +%Y-%m-%d`"
Jednak by oszczędzić Wam problemów z , ‘ oraz ”, na zajęciach będzie wykorzystywane zawsze ``$()`.
Specjalne zmienne
Skrypt basha zawiera specjalne zmienne:
- $0 nazwa skryptu
- $1-$9 argumenty skryptu
- $# liczba argumentów
- $@ wszystkie argumenty na raz
Zadanie 6
Napisać skrypt (i uruchomić z 3. dowolnymi argumentami), który:
- wypisze liczbę argumentów skryptu
- wypisze drugi argument
- wypisze wszystkie dostępne zmienne środowiskowe, które w swojej wartości zawierają Państwa nazwę użytkownika (użyć zmiennej
$USER
)
Instrukcje warunkowe
Wykonanie każdego programu może skończyć się albo sukcesem, albo porażką, do syngalizowania sukcesu lub porażki służy tzw. kod wyjścia.
Note: W C kod wyjścia programu jest sygnalizowani (między innymi) wartością zwracaną przez funkcję main.
Jeśli program wykonmał się poprawnie funkcja zwraca 0, jeśli nie poprawnie inną wartość.
Note: Jest to notacja odwrotna od tej stosowanej w C, tam 0 oznacza fałsz, a 1 prawdę.
Powód takiej notacji w jest prosty: Program może poprawnie się wykoanć tylko w jeden sposób, może natomiast napotkać na wiele problemów, które spowodują błędne wykonanie.
Do sprawdzenia kodu wyjścia ostatniego polecenia można użyć magicznej zmiennej $?.
Instrukcja if w Bash ma następującą składnię:
if warunek
then
fi
Gdzie warunek jest dowolnym programem. Jeśli program ten zwróci kod wyjścia 0 warunek się wykona, nie wykona się natomiast jeśli zwróci inny kod wyjścia.
Przykładowo by sprawdzić czy foo jest nazwą użytkownika można użyć:
if grep foo /etc/ passwd > /dev/null
then
echo "Jest"
fi
Note: Uwaga została zastosowana tu nowa składnia polecenia grep jest to składnia grep wzorzec nazwa pliku oraz wyjście z grep zostało przekierowane do pliku /dev/null
.
Pełna składnia if jest taka:
if warunek1
then
polecenie1
elif warunek2
then
polecenie2
else
polecenie3
fi
W warunku if często korzysta się z polecenia test, na przykład test -e
plik sprawdza czy plik istnieje:
if test -e /tmp/foo
then
echo istnieje
else
echo nie istnieje
fi
Polecam sprawdzenie jak działa polecenie test za pomocą man test.
Polecenie test można wykorzystać również za pomocą krótszej postaci, tj. nawiasów kwadratowych:
if [ -e /tmp/foo ]
then
echo istnieje
else
echo nie istnieje
fi
Uwaga: między [ oraz ], a warunkiem musi znajdować się przynajmniej jedna spacja.
Zadanie 7
Napisać skrypt, który:
- sprawdzi czy istnieje plik
~/.xsession-errors
i wypisze odpowiednią informację
- porówna liczbę plików w katalogu głównym oraz domowym i wypisze odpowiednią informację
Note: Polecam program wc (proszę przeczytać man wc
)
Obliczenia arytmetyczne
Do obliczeń arytmetycznych służy funkcja let:
let x=10
echo $x # wypisze 10
let "x /= 3"
echo $x # wypisze 3
let "x *= x"
echo $x # wypisze 9
Warning Bash może wspierać tylko arytmetykę stałoprzecinkową, dla której 10/3 wynosi dokładnie 3.
Warning Przy wykonywaniu operacji należy umieszczać spacje wokół operatora =.
Funkcje
Niektóre fragmenty skryptu można zamknąć w funkcję, składnia funkcji jest następująca:
function func {
# Treść
}
By wykonać funkcję należy napisać jej nazwę.
Do funkcji można przekazywać parametry. Parametry funkcji są dostępne za pomocą tych samych zmiennych co argumenty skyptu, tj:
- $1-$9 argumenty funkcji
- $# liczba argumentów
- $@ wszystkie argumenty na raz
Pętle
Pętla for pozwala na iterowanie po zbiorze elementów separowanych spacją:
for i in a b c d
do
echo "wartość iteratora to $i"
done
for i in /etc/*conf
do
echo "$i"
done
Note: Można skonfigurować basha tak, by separatorem był inny znak, ale poprzestańmy na spacji.
while - sprawdza, czy warunek jest prawdziwy, jeśli tak, pętla wykonuje się, aż warunek stanie się fałszywy:
a=0
while [ $a -lt 5 ]
do
echo "pętla wykonuje się po raz: $a"
a=$[a + 1] # lub a=$(( $a + 1 ))
done
until - sprawdza, czy warunek jest fałszywy, jeśli tak, pętla wykonuje się aż warunek stanie się prawdziwy:
a=0
until [ $a -gt 5 ]
do
echo "pętla wykonuje się po raz: $a"
a=$[a + 1]
done
Zadanie 8
Napisz funkcję, która liczy silnię jej argumentu, wykonaj ją dla liczb od 1 do 15.
Polecenia, które trzeba znać
Wszystkie, które pojawiły się podczas tego laboratorium, oraz:
-
cp
-
mv
-
mkdir
-
touch
-
ssh
-
scp
-
more
-
ls
, ls -a
, ls -h
, ls -t
, ls -l
, ls -r
-
rm
-
grep
-
pwd
-
find
-
ps
-
top
-
ping
-
wget
-
cat
Więcej informacji można znaleźć tutaj, na dole strony.
Projekt 1
Projekty realizowane są pojedynczo. Z projektu można uzyskać maksymalnie 15 punktów. Dostępne tematy można znaleźć tutaj.
Zadania i informacje dodatkowe
Proszę wylistować użytkowników z pliku /etc/passwd
za pomocą polecenia cut
.
Note Polecenie cut
służy do wypisywania wybranych części (elementów) linii z pliku tekstowego. W naszym przypadku używamy to polecenie z opcją -d :
, która powoduje, że linie dzielone są na części odseparowane od siebie znakiem :. Użycie opcji -f 1
wybiera 1 część (z 2 drugą część, itd.)