May 1, 2025, Thursday, 120

SK Zadanie 2

From Łukasz Graczykowski

(Difference between revisions)
Jump to: navigation, search
Line 94: Line 94:
-
== Pliki specjalnei ==  
+
== Pliki specjalne ==  
Plik /dev/null to plik, który przyjmuje dowolne dane, które potem znikają.
Plik /dev/null to plik, który przyjmuje dowolne dane, które potem znikają.
Line 109: Line 109:
Sygnały są metodą na komunikację między procesami w systemach Linux’owych. Pozwalają, na przykład, na:
Sygnały są metodą na komunikację między procesami w systemach Linux’owych. Pozwalają, na przykład, na:
-
Poproszenie procesu o wyłączenie się
+
* Poproszenie procesu o wyłączenie się
-
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 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.
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.
Line 130: Line 130:
== Zadanie 3==  
== Zadanie 3==  
Proszę uruchomić przeglądarkę iceweasel, wstrzymać ją a następnie wznowić jej proces.
Proszę uruchomić przeglądarkę iceweasel, wstrzymać ją a następnie wznowić jej 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
 +
Uwaga: Białe znaki mają znaczenie: tj. poniższy kod jest niepoprawny: foo = "bar"
 +
 +
Export powoduje, że zmienne są dostępne dla podprocesów.
 +
 +
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:
 +
 +
* cd
 +
* pwd
 +
* ls
 +
* cat
 +
* grep
 +
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 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.
 +
 +
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 ==
 +
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)
 +
aktualna data to: pon, 9 mar 2015, 17:47:38 CET (skorzystać z polecenia date)
 +
 +
 +
== 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 ”, będę wykorzystywał ``$()`.
 +
 +
==Specjalne zmienne==
 +
Skrypt basha zawiera specjalne zmienne:
 +
 +
* $0 nazwa skryptu
 +
* $1-$9 argumenty skryptu
 +
* $# liczba argumentów
 +
* $@ wszystkie argumenty na raz
 +
 +
== Zadanie 7 ==
 +
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)

Revision as of 10:33, 13 October 2016

Contents

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

  • cat

Program cat odczytuje zawartość plików i przekierowuje ją na standardowe wyjście:

cat nazwa_pliku
  • Przekierownia > i >>

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
  • tail

Program tail okazuje koncówkę pliku

cat /usr/share/romeo | tail -n 100
  • head

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>>.

  • Podsumowanie
>

Zapisuje wynik działania do pliku.

>>

Dodaje wynik działania do pliku.

2>

Przekierowuje strumień błędów.

|

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:

  1. Wypisać linie zawierające słowo Juliet.
  2. Wypisać linie zawierające słowo Juliet z numerami linii.
  3. 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ć przeglądarkę iceweasel, wstrzymać ją a następnie wznowić jej 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 Uwaga: Białe znaki mają znaczenie: tj. poniższy kod jest niepoprawny: foo = "bar"

Export powoduje, że zmienne są dostępne dla podprocesów.

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:

  • cd
  • pwd
  • ls
  • cat
  • grep

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 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.

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

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) aktualna data to: pon, 9 mar 2015, 17:47:38 CET (skorzystać z polecenia date)


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 ”, będę wykorzystywał ``$()`.

Specjalne zmienne

Skrypt basha zawiera specjalne zmienne:

  • $0 nazwa skryptu
  • $1-$9 argumenty skryptu
  • $# liczba argumentów
  • $@ wszystkie argumenty na raz

Zadanie 7

Napisać skrypt (i uruchomić z 3. dowolnymi argumentami), który:

  1. wypisze liczbę argumentów skryptu
  2. wypisze drugi argument
  3. wypisze wszystkie dostępne zmienne środowiskowe, które w swojej wartości zawierają Państwa nazwę użytkownika (użyć zmiennej $USER)


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.)