Środowisko programisty/Bash - podstawowe komendy: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pan (dyskusja | edycje)
Procesy: Literówka
Pan (dyskusja | edycje)
cut: Dodane ćwiczenie
 
(Nie pokazano 12 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 5: Linia 5:
! Polecenie !! Opis
! Polecenie !! Opis
|-
|-
| echo || wypisywanie na ekran
| <code>echo</code> || wypisywanie na ekran
|-
|-
| sleep || zawieszanie wykonania
| <code>sleep</code> || zawieszanie wykonania
|-
|-
| clear || czyszczenie okna
| <code>clear</code> || czyszczenie okna
|-
|-
| reset || resetowanie terminala
| <code>reset</code> || resetowanie terminala
|}
|}


=== echo ===
=== echo ===


Polecenie echo służy do wypisywania swoich argumentów.
Polecenie <code>echo</code> służy do wypisywania swoich argumentów.


==== Wybrane opcje ====
==== Wybrane opcje ====


{|
{|
| '''-n''' || nie przechodzi do następnej linii
| <code>-n</code> || nie przechodzi do następnej linii
|-
|-
| '''-e''' || interpretacja znaków specjalnych (ze znakiem \)
| <code>-e</code> || interpretacja znaków specjalnych (ze znakiem <code>\</code>)
|}
|}
Przy użyciu opcji -e rozpoznawane są znaki specjalne (poprzedzone \), na przykład
Przy użyciu opcji <code>-e</code> rozpoznawane są znaki specjalne (poprzedzone <code>\</code>), na przykład
{|
{|
| '''\\''' || \
| <code>\\</code> || znak <code>\</code>
|-
|-
| '''\a''' || sygnał dźwiękowy
| <code>\a</code> || sygnał dźwiękowy
|-
|-
| '''\b''' || znak w tył (backspace)
| <code>\b</code> || znak w tył (backspace)
|-
|-
| '''\n''' || nowa linia
| <code>\n</code> || nowa linia
|-
|-
| '''\r''' || powrót karetki, tzn. kursor jest przesuwany do początku linii
| <code>\r</code> || powrót karetki, tzn. kursor jest przesuwany do początku linii
|-
|-
| '''\t''' || znak tabulacji
| <code>\t</code> || znak tabulacji
|}
|}


Linia 50: Linia 50:
  Linia 2
  Linia 2
  bashtest@host:~$
  bashtest@host:~$
Początkowo może być niejasne, co oznacza wywołanie echo -en '\b'. Otóż jest to konwencja podawania opcji w sposób skrócony. Zamiast pisać -e -n możemy skrócić te dwie opcje do -en. Konwencji skrótowej można używać we wszystkich przedstawionych tutaj narzędziach. Więcej o tej konwencji można przeczytać w '''man 3 getopt'''.
Początkowo może być niejasne, co oznacza wywołanie <code>echo -en '\b'</code>. Otóż jest to konwencja podawania opcji w sposób skrócony. Zamiast pisać <code>-e -n</code> możemy skrócić te dwie opcje do <code>-en</code>. Konwencji skrótowej można używać we wszystkich przedstawionych tutaj narzędziach. Więcej o tej konwencji można przeczytać w <code>man 3 getopt</code>.


=== sleep ===
=== sleep ===


Polecenie sleep bierze jeden argument, liczbę całkowitą i czeka właśnie tyle sekund. Na przykład '''sleep 60''' czeka minutę. Polecenie to jest przydatne w skryptach lub w pętlach, gdy między jedną, a drugą czynnością potrzebujemy odstępu czasowego.
Polecenie sleep bierze jeden argument, liczbę całkowitą i czeka właśnie tyle sekund. Na przykład <code>sleep 60</code> czeka minutę. Polecenie to jest przydatne w skryptach lub w pętlach, gdy między jedną, a drugą czynnością potrzebujemy odstępu czasowego.


=== clear ===
=== clear ===
Linia 62: Linia 62:
=== reset ===
=== reset ===


Resetuje terminal. Podobnie jak clear czyści też ekran, ale również przywraca ustawienia terminala. Przydatne w przypadku, gdy zmienimy ustawienia terminala tak, że nie jesteśmy w stanie na nim pracować, na przykład po tym, gdy każemy wypisać (przez nie uwagę) plik binarny.
Resetuje terminal. Podobnie jak <code>clear</code> czyści też ekran, ale również przywraca ustawienia terminala. Przydatne w przypadku, gdy zmienimy ustawienia terminala tak, że nie jesteśmy w stanie na nim pracować, na przykład po tym, gdy każemy wypisać (przez nie uwagę) plik binarny.


== Operowanie na plikach i katalogach ==
== Operowanie na plikach i katalogach ==
Linia 70: Linia 70:
! Polecenie !! Opis
! Polecenie !! Opis
|-
|-
| cd || zmiana katalogu
| <code>cd</code> || zmiana katalogu
|-
|-
| pwd || bieżący katalog
| <code>pwd</code> || bieżący katalog
|-
|-
| ls || lista plików i katalogów
| <code>ls</code> || lista plików i katalogów
|-
|-
| mkdir || tworzenie katalogu
| <code>mkdir</code> || tworzenie katalogu
|-
|-
| cp || kopiowanie plików/katalogów
| <code>cp</code> || kopiowanie plików/katalogów
|-
|-
| rm || usuwanie plików/katalogów
| <code>rm</code> || usuwanie plików/katalogów
|-
|-
| mv || przenoszenie/zmiana nazwy pliku/katalogu
| <code>mv</code> || przenoszenie/zmiana nazwy pliku/katalogu
|-
|-
| cat || wypisanie zawartości pliku
| <code>cat</code> || wypisanie zawartości pliku
|-
|-
| more/less || przeglądanie zawartości pliku
| <code>more</code>/<code>less</code> || przeglądanie zawartości pliku
|-  
|-  
| touch || uaktualnianie daty pliku, bądź tworzenie pliku  
| <code>touch</code> || uaktualnianie daty pliku, bądź tworzenie pliku  
|-  
|-  
| df || wyświetla ilość wolnego miejsca na wszystkich dyskach
| <code>df</code> || wyświetla ilość wolnego miejsca na wszystkich dyskach
|-
|-
| du || wyświetla zużycie dysku w wybranych katalogach
| <code>du</code> || wyświetla zużycie dysku w wybranych katalogach
|}
|}


=== cd ===
=== cd ===


cd zmienia aktualny katalog na katalog podany w argumencie polecenie. Wywołanie cd bez argumentów zmienia katalog na katalog domowy aktualnego użytkownika.
<code>cd</code> zmienia aktualny katalog na katalog podany w argumencie polecenia. Wywołanie <code>cd</code> bez argumentów zmienia katalog na katalog domowy aktualnego użytkownika.


Bash wprowadza również katalogi specjalne z użyciem znaku ~. Nazwy zaczynające się od znaku ~ (nie ujęte w cudzysłowy) mają specjalne znaczenie, na przykład:
Bash wprowadza również katalogi specjalne z użyciem znaku <code>~</code>. Nazwy zaczynające się od znaku <code>~</code> (nie ujęte w cudzysłowy) mają specjalne znaczenie, na przykład:
{|
{|
| '''~''' || katalog domowy aktualnego użytkownika
| <code>~</code> || katalog domowy aktualnego użytkownika
|-
|-
| '''~/kat1''' || katalog '''kat1''' w katalogu domowym aktualnego użytkownika
| <code>~/kat1</code> || katalog <code>kat1</code> w katalogu domowym aktualnego użytkownika
|-
|-
| '''~ktos''' || katalog domowy użytkownika o loginie '''ktos'''
| <code>~ktos</code> || katalog domowy użytkownika o loginie <code>ktos</code>
|-
|-
| '''~ktos/kat1/kat2''' || katalog '''kat1/kat2''' w katalogu domowym użytkownika o loginie '''ktos'''
| <code>~ktos/kat1/kat2</code> || katalog <code>kat1/kat2</code> w katalogu domowym użytkownika o loginie <code>ktos</code>
|}
|}


Przypomnijmy, że są też następujące katalogi:
Przypomnijmy, że są też następujące katalogi:
{|
{|
| '''.''' || bieżący katalog
| <code>.</code> || bieżący katalog
|-
|-
| '''..''' || katalog nadrzędny
| <code>..</code> || katalog nadrzędny
|-
|-
| '''/''' || katalog główny
| <code>/</code> || katalog główny
|}
|}


Linia 125: Linia 125:
==== Wybrane opcje ====
==== Wybrane opcje ====


Komenda ls może przyjmować wiele argumentów, które głównie dotyczą formatowania wyjścia. Przedstawiamy tylko opcje najczęściej używane.
Komenda <code>ls</code> może przyjmować wiele argumentów, które głównie dotyczą formatowania wyjścia. Przedstawiamy tylko opcje najczęściej używane.
{|
{|
| '''-R''' || wyświetla zawartość katalogów rekurencyjnie
| <code>-R</code> || wyświetla zawartość katalogów rekurencyjnie
|-
|-
| '''-a''' || wyświetla wszystkie pliki, również pliki ukryte; w Linuksie pliki ukryte to takie, które zaczynają się od kropki
| <code>-a</code> || wyświetla wszystkie pliki, również pliki ukryte; w Linuksie pliki ukryte to takie, które zaczynają się od kropki
|-
|-
| '''-l''' || wyświetla dokładną informację o każdym z plików (atrybuty, rozmiar, datę modyfikacji, itp.)
| <code>-l</code> || wyświetla dokładną informację o każdym z plików (atrybuty, rozmiar, datę modyfikacji, itp.)
|}
|}


=== mkdir ===
=== mkdir ===


Tworzy katalog podany jako argument. Z opcją '''-p''' tworzy również katalogi, które są potrzebne do utworzenia katalogu docelowego. Na przykład jeśli wywołamy
Tworzy katalog podany jako argument. Z opcją <code>-p</code> tworzy również katalogi, które są potrzebne do utworzenia katalogu docelowego. Na przykład jeśli wywołamy
  mkdir kat1/kat2
  mkdir kat1/kat2
to, aby utworzyć kat2, musi istnieć kat1, a jeśli wywołamy
to, aby utworzyć <code>kat2</code>, musi istnieć <code>kat1</code>, a jeśli wywołamy
  mkdir -p kat1/kat2
  mkdir -p kat1/kat2
to, jeśli nie istnieje kat1, to jest tworzony i dopiero potem następuje utworzenie kat2 w katalogu kat1.
to, jeśli nie istnieje <code>kat1</code>, to jest tworzony i dopiero potem następuje utworzenie <code>kat2</code> w katalogu <code>kat1</code>.


=== cp ===
=== cp ===


Zasadniczo są trzy najczęściej stosowane wywołania komendy cp:
Zasadniczo są trzy najczęściej stosowane wywołania komendy <code>cp</code>:
; cp plik1 plik2 : kopiuje plik1 i zapisuje go jako plik2, jeśli plik2 istnieje, to go nadpisuje,
; <code>cp plik1 plik2</code> : kopiuje <code>plik1</code> i zapisuje go jako <code>plik2</code>, jeśli <code>plik2</code> istnieje, to go nadpisuje,
; cp plik1 ... plikn katalog : kopiuje pliki do katalogu, jeśli jakiś plik istnieje już w katalogu docelowym, to zostaje on nadpisany,
; <code>cp plik1 ... plikn katalog</code> : kopiuje pliki do katalogu, jeśli jakiś plik istnieje już w katalogu docelowym, to zostaje on nadpisany,
; cp -a katalog1 katalog2 : kopiuje rekurencyjnie katalog1 wraz zawartością; jeśli katalog2 istnieje, to kopia katalog1 zostanie umieszczona w tym katalogu, tzn. po wykonaniu tej operacji w katalog2 będzie katalog1 wraz zawartością; jeśli katalog2 nie istnieje, to kopia zawartości katalog1 znajdzie się w katalog2, tzn. katalog2 zostanie utworzony, a zawartość katalog1 będzie skopiowana do katalog2.
; <code>cp -a katalog1 katalog2</code> : kopiuje rekurencyjnie <code>katalog1</code> wraz zawartością; jeśli <code>katalog2</code> istnieje, to kopia <code>katalog1</code> zostanie umieszczona w tym katalogu, tzn. po wykonaniu tej operacji w <code>katalog2</code> będzie <code>katalog1</code> wraz zawartością; jeśli <code>katalog2</code> nie istnieje, to kopia zawartości <code>katalog1</code> znajdzie się w <code>katalog2</code>, tzn. <code>katalog2</code> zostanie utworzony, a zawartość <code>katalog1</code> będzie skopiowana do <code>katalog2</code>.


Jeśli chcemy, aby cp pytało nas, czy nadpisywać istniejące już pliki, to dodajemy opcję '''-i'''. Jeżeli taki tryb mamy ustawiony domyślnie, to możemy też chcieć, aby cp pytało nas, czy nadpisywać istniejące już pliki, wtedy dodajemy opcję '''-f'''.
Jeśli chcemy, aby <code>cp</code> pytało nas, czy nadpisywać istniejące już pliki, to dodajemy opcję <code>-i</code>. Jeżeli taki tryb mamy ustawiony domyślnie, to możemy też chcieć, aby <code>cp</code> pytało nas, czy nadpisywać istniejące już pliki, wtedy dodajemy opcję <code>-f</code>.


=== rm ===
=== rm ===


To polecenie usuwa wszystkie pliki, które są podane jako argumenty. Jeżeli chcemy usunąć też katalogi, to możemy użyć opcji '''-r'''. Opcji tej należy używać raczej ostrożnie, gdyż usuwa ona rekurencyjnie zawartość katalogów.
To polecenie usuwa wszystkie pliki, które są podane jako argumenty. Jeżeli chcemy usunąć też katalogi, to możemy użyć opcji <code>-r</code>. Opcji tej należy używać raczej ostrożnie, gdyż usuwa ona rekurencyjnie zawartość katalogów.


Możemy poprosić o pytanie przed usunięcie każdego pliku dodając opcję '''-i'''. Możemy także poprosić o to, aby nie pojawiały się żadne pytania dodając opcję '''-f'''. Przy tej opcji trzeba zachować ostrożność, szczególnie gdy używamy ją łącznie z opcją '''-r'''.
Możemy poprosić o pytanie przed usunięcie każdego pliku dodając opcję <code>-i</code>. Możemy także poprosić o to, aby nie pojawiały się żadne pytania dodając opcję <code>-f</code>. Przy tej opcji trzeba zachować ostrożność, szczególnie gdy używamy ją łącznie z opcją <code>-r</code>.


Do usuwania katalogów bezpieczniej jest stosować polecenie '''rmdir''', które usuwa katalog tylko, gdy jest on pusty.
Do usuwania katalogów bezpieczniej jest stosować polecenie <code>rmdir</code>, które usuwa katalog tylko, gdy jest on pusty.


=== mv ===
=== mv ===


To polecenie ma trzy możliwe sposoby wywołania:
To polecenie ma trzy możliwe sposoby wywołania:
; mv plik1 plik2 : zmienia nazwę plik1 na plik2 (jak jest taka potrzeba wykonane jest także przeniesienie pomiędzy katalogami),
; <code>mv plik1 plik2</code> : zmienia nazwę <code>plik1</code> na <code>plik2</code> (jak jest taka potrzeba wykonane jest także przeniesienie pomiędzy katalogami),
; mv plik_lub_katalog1 ... plik_lub_katalogn katalog : w tej wersji katalog podany w ostatnim argumencie musi istnieć; wszystkie pliki i katalogi są przenoszone do tego katalogu,
; <code>mv plik_lub_katalog1 ... plik_lub_katalogn katalog</code> : w tej wersji katalog podany w ostatnim argumencie musi istnieć; wszystkie pliki i katalogi są przenoszone do tego katalogu,
; mv katalog1 katalog2 : jeśli katalog2 nie istnieje, to zmieniana jest nazwa podobnie jak przy pierwszym sposobie wywołania; jeśli katalog2 istnieje, to zachowanie jest takie samo jak w poprzednim sposobie wywołania.
; <code>mv katalog1 katalog2</code> : jeśli <code>katalog2</code> nie istnieje, to zmieniana jest nazwa podobnie jak przy pierwszym sposobie wywołania; jeśli <code>katalog2</code> istnieje, to zachowanie jest takie samo jak w poprzednim sposobie wywołania.


Podobnie jak przy poleceniu '''cp''' możemy dodawać opcję '''-i''' lub '''-f''' aby ustawić opcję potwierdzania nadpisywania istniejących plików.
Podobnie jak przy poleceniu <code>cp</code> możemy dodawać opcję <code>-i</code> lub <code>-f</code> aby ustawić opcję potwierdzania nadpisywania istniejących plików.


=== cat ===
=== cat ===


Przy braku argumentów cat po prostu kopiuje standardowe wejście na standardowe wyjście. Przy jednym argumencie wypisuje zawartość pliku o podanej nazwie na standardowe wyjście. Przy większej liczbie argumentów cat wypisuje na standardowe wyjście wszystkie pliki w kolejności, w jakiej zostały one podane. W ten sposób możemy łączyć kilka plików w jeden.
Przy braku argumentów <code>cat</code> po prostu kopiuje standardowe wejście na standardowe wyjście. Przy jednym argumencie wypisuje zawartość pliku o podanej nazwie na standardowe wyjście. Przy większej liczbie argumentów <code>cat</code> wypisuje na standardowe wyjście wszystkie pliki w kolejności, w jakiej zostały one podane. W ten sposób możemy łączyć kilka plików w jeden.


Wywołanie
Wywołanie
Linia 179: Linia 179:
  bashtest@host:~$ cat plikc >> plik
  bashtest@host:~$ cat plikc >> plik


Łącznie z poleceniem '''split''' można użyć tej możliwości do przenoszenia dużych plików w kawałkach przez mniejsze media. Pokażemy to na przykładzie. Załóżmy, że przenosimy plik '''cdimage.iso'''. Dzielimy go wpierw na części:
Łącznie z poleceniem <code>split</code> można użyć tej możliwości do przenoszenia dużych plików w kawałkach przez mniejsze media. Pokażemy to na przykładzie. Załóżmy, że przenosimy plik <code>cdimage.iso</code>. Dzielimy go wpierw na części:
  bashtest@host:~$ ls -l
  bashtest@host:~$ ls -l
  -rw-r--r-- 1 bashtest users 495605760 2006-08-11 17:53 cdimage.iso
  -rw-r--r-- 1 bashtest users 495605760 2006-08-11 17:53 cdimage.iso
Linia 190: Linia 190:
  -rw-r--r-- 1 bashtest users 118118400 2006-08-11 17:57 xad
  -rw-r--r-- 1 bashtest users 118118400 2006-08-11 17:57 xad
  bashtest@host:~$
  bashtest@host:~$
Powstały pliki '''xaa''', '''xab''', '''xac''', '''xad'''. Można było użyć drugiego argumentu przy poleceniu split, aby przedrostek był więcej mówiący niż przedrostek '''x'''. Teraz przenosimy pliki '''x*''', na przykład przy użyciu czterech dysków USB o pojemności 128MB, na inny komputer, nagrywamy je do jednego katalogi i poleceniem cat z powrotem łączymy w jeden plik.
Powstały pliki <code>xaa</code>, <code>xab</code>, <code>xac</code>, <code>xad</code>. Można było użyć drugiego argumentu przy poleceniu split, aby przedrostek był więcej mówiący niż przedrostek <code>x</code>. Teraz przenosimy pliki <code>x*</code>, na przykład przy użyciu czterech dysków USB o pojemności 128MB, na inny komputer, nagrywamy je do jednego katalogu i poleceniem <code>cat</code> z powrotem łączymy w jeden plik.
  bashtest@host:~$ ls -l x*
  bashtest@host:~$ ls -l x*
  -rw-r--r-- 1 bashtest users 125829120 2006-08-11 18:10 xaa
  -rw-r--r-- 1 bashtest users 125829120 2006-08-11 18:10 xaa
Linia 204: Linia 204:
=== more/less ===
=== more/less ===


Narzędzia more i less służą do wygodnego przeglądania pliku, bądź standardowego wejście. Jeśli mają one podany argument, to przeglądają plik o podanej nazwie. Uruchomione bez argumentów przeglądają to, co dostają na standardowym wejście.
Narzędzia <code>more</code> i <code>less</code> służą do wygodnego przeglądania pliku, bądź standardowego wejścia. Jeśli mają one podany argument, to przeglądają plik o podanej nazwie. Uruchomione bez argumentów przeglądają to, co dostają na standardowym wejściu.


Podstawowa różnica między tymi komendami jest taka, że more pozwala przeglądać pliki tylko w przód, podczas gdy less pozwala przeglądać je również do tyłu. Przeglądanie odbywa sie przy użyciu intuicyjnej klawiatury (tj. strzałek).
Podstawowa różnica między tymi komendami jest taka, że <code>more</code> pozwala przeglądać pliki tylko w przód, podczas gdy less pozwala przeglądać je również do tyłu. Przeglądanie odbywa sie przy użyciu intuicyjnej klawiatury (tj. strzałek).


Najczęściej wykorzystuje się less w sytuacji, gdy jakiś program wyrzuca bardzo dużo informacji na standardowe wyjście. Jednym rozwiązaniem jest przekierowanie wyjścia do pliku i później przejrzenie pliku za pomocą jakiegoś edytora bądź polecenia less. Inną możliwością jest użycie potoku. Na przykład:
Najczęściej wykorzystuje się <code>less</code> w sytuacji, gdy jakiś program wyrzuca bardzo dużo informacji na standardowe wyjście. Jednym rozwiązaniem jest przekierowanie wyjścia do pliku i później przejrzenie pliku za pomocą jakiegoś edytora bądź polecenia <code>less</code>. Inną możliwością jest użycie potoku. Na przykład:
  bashtest@host:~$ ls -lR / | less
  bashtest@host:~$ ls -lR / | less
Jeśli polecenie wypluwa też dużo na standardowe wyjście diagnostyczne, to można przekierować je na zwykłe standardowe wyjście, używając przekierowania '''2>&1''':
Jeśli polecenie wypluwa też dużo na standardowe wyjście diagnostyczne, to można przekierować je na zwykłe standardowe wyjście, używając przekierowania <code>2>&1</code>:
  bashtest@host:~$ ls -lR / 2>&1 | less
  bashtest@host:~$ ls -lR / 2>&1 | less
w ten sposób obejrzymy zarówno to, co idzie na standardowe wyjście, jak i standardowe wyjście diagnostyczne.
w ten sposób obejrzymy zarówno to, co idzie na standardowe wyjście, jak i standardowe wyjście diagnostyczne.
Linia 216: Linia 216:
=== du ===
=== du ===


Wyświetla zużycie pojemności dysku dla każdego katalogu rekurencyjnie dla podanych argumentów. Jeśli  brakuje argumentów, to przegląda katalog bieżący. Polecenie to jest przydatne do policzenia sumarycznej zajętości dysku (opcja '''-s''') albo do przejrzenia rozmiarów podkatalogów danego katalogu (opcja '''--max-depth=1''').
Wyświetla zużycie pojemności dysku dla każdego katalogu rekurencyjnie dla podanych argumentów. Jeśli  brakuje argumentów, to przegląda katalog bieżący. Polecenie to jest przydatne do policzenia sumarycznej zajętości dysku (opcja <code>-s</code>) albo do przejrzenia rozmiarów podkatalogów danego katalogu (opcja <code>--max-depth=1</code>).


== Operowanie na plikach tekstowych ==
== Operowanie na plikach tekstowych ==
Linia 224: Linia 224:
! Polecenie !! Opis
! Polecenie !! Opis
|-
|-
| head || wypisanie początku pliku
| <code>head</code> || wypisanie początku pliku
|-
|-
| tail || wypisanie końca pliku
| <code>tail</code> || wypisanie końca pliku
|-
|-
| wc || zliczanie znaków/słów/linii
| <code>wc</code> || zliczanie znaków/słów/linii
|-
|-
| cut || wypisywanie wybranych części z każdej linii
| <code>cut</code> || wypisywanie wybranych części z każdej linii
|-
|-
| tr || zamienianie/usuwanie znaków
| <code>tr</code> || zamienianie/usuwanie znaków
|-
|-
| sort || sortowanie po liniach
| <code>sort</code> || sortowanie po liniach
|-
|-
| uniq || usuwanie/znajdywanie powtarzających się linii
| <code>uniq</code> || usuwanie/znajdywanie powtarzających się linii
|-
|-
| tac || wypisanie plików od tyłu
| <code>tac</code> || wypisanie plików od tyłu
|-
|-
| diff || porównywanie dwóch plików
| <code>diff</code> || porównywanie dwóch plików
|}
|}


=== head ===
=== head ===


Wypisuje początkowe fragmenty plików, których nazwy zostały podane jako argumenty. Jeśli nie zostały podane argumenty, to czyta ze standardowego wejścia. Domyślnie jest to 10 pierwszych linii. Podając opcję '''-N''', gdzie N jest liczbą, head wyświetli N pierwszych linii.
Wypisuje początkowe fragmenty plików, których nazwy zostały podane jako argumenty. Jeśli nie zostały podane argumenty, to czyta ze standardowego wejścia. Domyślnie jest to 10 pierwszych linii. Podając opcję <code>-N</code>, gdzie <code>N</code> jest liczbą, <code>head</code> wyświetli <code>N</code> pierwszych linii.


=== tail ===
=== tail ===


Polecenie podobne do head, z tą różnicą, że wypisuje końcowe fragmenty pliku. Ma identyczne opcje jak head.
Polecenie podobne do <code>head</code>, z tą różnicą, że wypisuje końcowe fragmenty pliku. Ma identyczne opcje jak <code>head</code>.


=== wc ===
=== wc ===
Linia 255: Linia 255:
Zlicza liczbę znaków, słów i linii w plikach podanych jako argumenty, bądź przy braku argumentów statystyki te liczy dla standardowego wejścia. Można wybrać, którą statystykę chcemy dostać podając jedną z opcji:
Zlicza liczbę znaków, słów i linii w plikach podanych jako argumenty, bądź przy braku argumentów statystyki te liczy dla standardowego wejścia. Można wybrać, którą statystykę chcemy dostać podając jedną z opcji:
{|
{|
| '''-c''' || liczenie tylko znaków
| <code>-c</code> || liczenie tylko znaków
|-
|-
| '''-w''' || liczenie tylko słów
| <code>-w</code> || liczenie tylko słów
|-
|-
| '''-l''' || liczenie tylko linii
| <code>-l</code> || liczenie tylko linii
|}
|}


Ćwiczenie: wypisać liczbę linii podanego plik, ale jeśli jest to więcej niż 20, to wypisać 20.
==== Ćwiczenie ====
 
Wypisać liczbę linii podanego pliku, ale jeśli jest to więcej niż 20, to wypisać 20.


=== cut ===
=== cut ===
Linia 268: Linia 270:
Wypisuje wybrane części linii plików podanych w argumentach na standardowe wyjście. W przypadku braku argumentów czyta ze standardowego wejścia.
Wypisuje wybrane części linii plików podanych w argumentach na standardowe wyjście. W przypadku braku argumentów czyta ze standardowego wejścia.


Każdą linię dzielimy na pola za pomocą znaku zwanego separatorem. Domyślnie jest to znak tabulacji. Separator można podawać za pomocą opcji '''-d'''. Na przykład, dla linii
Każdą linię dzielimy na pola za pomocą znaku zwanego separatorem. Domyślnie jest to znak tabulacji. Separator można podawać za pomocą opcji <code>-d</code>. Na przykład, dla linii
  jkow,Jan Kowalski,1990,,Warszawa
  jkow,Jan Kowalski,1990,,Warszawa
i dla separatora ''',''' pola są następujące:
i dla separatora <code>,</code> pola są następujące:
{| border="1"
{| border="1"
! nr pola !! zawartość (w cudzysłowach)
! nr pola !! zawartość (w cudzysłowach)
|-
|-
| 1 || "jkow"
| 1 || "<code>jkow</code>"
|-
|-
| 2 || "Jan Kowalski"
| 2 || "<code>Jan Kowalski</code>"
|-
|-
| 3 || "1990"
| 3 || "<code>1990</code>"
|-
|-
| 4 || ""
| 4 || ""
|-
|-
| 5 || "Warszawa"
| 5 || "<code>Warszawa</code>"
|}
|}


Polecenie cut pozwala wybrać, które pola chcemy wybrać. Listę pól podajemy przy opcji '''-f'''. Lista pól składa się z zakresu lub kilku zakresów oddzielonych przecinkami. Zakres jest albo liczbą '''N''' oznaczającą N-te pole, albo przedziałem otwartym z lewej '''-N''' oznaczającym pola od 1 do N, albo przedziałem otwartym z prawej '''N-''' oznaczającym pola od N do ostatniego, albo wreszcie przedziałem '''N-M''' oznaczającym pola od N do M.
Polecenie <code>cut</code> pozwala wybrać, które pola chcemy wybrać. Listę pól podajemy przy opcji <code>-f</code>. Lista pól składa się z zakresu lub kilku zakresów oddzielonych przecinkami. Zakres jest albo liczbą <code>N</code> oznaczającą <code>N</code>-te pole, albo przedziałem otwartym z lewej <code>-N</code> oznaczającym pola od 1 do <code>N</code>, albo przedziałem otwartym z prawej <code>N-</code> oznaczającym pola od <code>N</code> do ostatniego, albo wreszcie przedziałem <code>N-M</code> oznaczającym pola od <code>N</code> do <code>M</code>.
  bashtest@host:~$ cat baza.txt  
  bashtest@host:~$ cat baza.txt  
  jkow,Jan Kowalski,1990,,Warszawa
  jkow,Jan Kowalski,1990,,Warszawa
Linia 307: Linia 309:
  Robert Kubica,1985,Kierowca Formuły 1
  Robert Kubica,1985,Kierowca Formuły 1
  bashtest@host:~$
  bashtest@host:~$
Jak dla powyższego pliku '''baza.txt''' wyodrębnić same nazwiska? Trzeba użyć polecenie cut dwukrotnie:
Jak dla powyższego pliku <code>baza.txt</code> wyodrębnić same nazwiska? Trzeba użyć polecenie <code>cut</code> dwukrotnie:
  bashtest@host:~$ cut -d , -f 2 baza.txt | cut -d ' ' -f 2
  bashtest@host:~$ cut -d , -f 2 baza.txt | cut -d ' ' -f 2
  Kowalski
  Kowalski
Linia 314: Linia 316:
  Kubica
  Kubica
  bashtest@host:~$
  bashtest@host:~$
Zauważmy, że <code>cut</code> słabo się nadaje do zadań typu podaj trzecie słowo, przy czym słowa mogą być rozdzielane dowolną liczbą białych znaków. Dla <code>cut</code> z użyciem spacji jako separatora, każde pojawienie się spacji oznacza wystąpienie nowego pola. W takich sytuacjach wygodniejsze staje się użycie programu <code>awk</code>. Na przykład
awk '{print $3;}'
wypisze dla każdej linii trzecie słowo.
==== Ćwiczenie ====
W pliku <code>/etc/passwd</code> zapisane są informacje o użytkownikach systemu. Należy wypisać imiona i nazwiska użytkowników. Więcej informacji można znaleźć w <code>man 5 passwd</code> lub poprzez analizę podanego pliku.


=== tr ===
=== tr ===
Linia 321: Linia 331:
Do zmieniania znaków używamy formy:
Do zmieniania znaków używamy formy:
  tr łańcuch1 łańcuch2
  tr łańcuch1 łańcuch2
Działa to tak, że znak występujący na i-tym miejscu w łańcuch1 jest zastępowany znakiem występującym na i-tym miejscu w łańcuch2. Na przykład
Działa to tak, że znak występujący na i-tym miejscu w <code>łańcuch1</code> jest zastępowany znakiem występującym na i-tym miejscu w <code>łańcuch2</code>. Na przykład
  tr abc xyz
  tr abc xyz
zamieni każde '''a''' na wejściu na '''x''', '''b''' na '''y''' i '''c''' na '''z'''.
zamieni każde <code>a</code> na wejściu na <code>x</code>, <code>b</code> na <code>y</code> i <code>c</code> na <code>z</code>.


Do usuwania znaków służy
Do usuwania znaków służy
  tr -d łańcuch1
  tr -d łańcuch1
Z wejścia są usuwane wszystkie znaki, które znajdują się w łańcuch1. Na przykład
Z wejścia są usuwane wszystkie znaki, które znajdują się w <code>łańcuch1</code>. Na przykład
  tr -d ';@'
  tr -d ';@'
usunie z wejścia wszystkie wystąpienia znaku ''';''' i '''@'''.
usunie z wejścia wszystkie wystąpienia znaku <code>;</code> i <code>@</code>.
Jeśli dodamy opcję '''-c''', spowoduje to branie wszystkich znaków nie znajdujących się w łańcuch1. Na przykład
Jeśli dodamy opcję <code>-c</code>, spowoduje to branie wszystkich znaków nie znajdujących się w <code>łańcuch1</code>. Na przykład
  tr -cd 0123456789
  tr -cd 0123456789
usunie wszystkie znaki poza cyframi.
usunie wszystkie znaki poza cyframi.


'''tr''' ma też parę innych funkcji, o których można przeczytać sobie w dokumentacji.
<code>tr</code> ma też parę innych funkcji, o których można przeczytać sobie w dokumentacji.


=== sort ===
=== sort ===


'''sort''' sortuje linie z podanych plików lub ze standardowego wejścia i wypisuje na standardowe wyjście. Domyślnie linie są porównywane leksykograficznie, ale jest szereg opcji kontrolujących sposób porównywania linii. Przykładem jest opcja '''-n''', która powoduje, że linie porównywane są numerycznie, tzn. porównywane są liczby występujące na początku linii.
<code>sort</code> sortuje linie z podanych plików lub ze standardowego wejścia i wypisuje na standardowe wyjście. Domyślnie linie są porównywane leksykograficznie, ale jest szereg opcji kontrolujących sposób porównywania linii. Przykładem jest opcja <code>-n</code>, która powoduje, że linie porównywane są numerycznie, tzn. porównywane są liczby występujące na początku linii.


=== uniq ===
=== uniq ===


Usuwa powtarzające się po sobie identyczne linie. Polecenie to jest zazwyczaj stosowane w potoku po komendzie '''sort'''.
Usuwa powtarzające się po sobie identyczne linie. Polecenie to jest zazwyczaj stosowane w potoku po komendzie <code>sort</code>.


=== tac ===
=== tac ===


Polecenie działa podobnie jak '''cat''' z tą różnicą, że linie podane na wejściu są wypisywane od tyłu. Przydaje się do odwracania plików.
Polecenie działa podobnie jak <code>cat</code> z tą różnicą, że linie podane na wejściu są wypisywane od tyłu. Przydaje się do odwracania plików.
 
==== Ćwiczenie ====
 
Załóżmy, że mamy plik z logiem z przebiegu rozwiązanych problemów. Log składa się linii postaci:
identyfikator_problemu czas_rozwiązania
Identyfikatorem problemów jest jeden wyraz. Czas rozwiązania jest liczbą podaną z dokładnością do trzech miejsc po przecinku. Przykładowa zawartość pliku:
KADRY 13.370
BILE 11.510
SOLE 17.010
KODY 13.370
Chcemy wiedzieć ile problemów jesteśmy w stanie rozwiązać dla danego limitu czasowego. Należy na wyjściu wypisać plik składający się z linii
liczba_rozwiązanych_problemów limit_czasowy
posortowanych po limicie czasowym. Przy czym limitami czasowymi są wszystkie możliwe czasy, które pojawiły się w pliku wejściowym. Na przykład dla powyższego pliku wynikiem powinno być:
1 11.510
3 13.370
4 17.010
Wskazówka: przydatne jest polecenie <code>nl</code>.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Rozwiązanie .
<div class="mw-collapsible-content" style="display:none">
cut -f 2 -d ' ' | sort -g | nl -w1 -s' ' | tac | uniq -f 1 | tac
</div>
</div>


=== diff ===
=== diff ===
Polecenie
diff plik1 plik2
porównuje dwa pliki i opisuje na standardowym wyjściu czym się różni <code>plik2</code> od <code>plik1</code>. Opis składa się z informacji, które linie trzeba usunąć, które dodać, a które zmodyfikować, aby z <code>plik1</code> otrzymać <code>plik2</code>.
Spójrzmy na przykład. Mamy dwa pliki tekstowe.
{| border="1" cellpadding="5"
|- style="text-align: center;"
| <code>1.txt</code> || <code>2.txt</code>
|-
|
<pre>
raz
dwa
trzy
cztery
pięć
sześć
siedem
te dwie linie
usuniemy
osiem
dziewięć
dziesięć
jedenaście
dwanaście
trzynaście
czternaście
tą linię zmodyfikujemy
piętnaście
</pre>
||
<pre>
tą linię dodaliśmy
raz
dwa
trzy
cztery
pięć
sześć
siedem
osiem
dziewięć
dziesięć
jedenaście
dwanaście
trzynaście
czternaście
tą linię zmodyfikowaliśmy
piętnaście
</pre>
|}
Dla tych plików wynik jest taki:
bashtest@host:~$ diff 1.txt 2.txt
0a1
> tą linię dodaliśmy
8,9d8
< te dwie linie
< usuniemy
17c16
< tą linię zmodyfikujemy
---
> tą linię zmodyfikowaliśmy
bashtest@host:~$
Używając opcji <code>-u</code> dostaniemy inny format porównania, który dodatkowo pokazuje kontekst wprowadzonych zmian:
<pre>
bashtest@host:~$ diff -u 1.txt 2.txt
--- 1.txt      2006-09-29 17:57:05.000000000 +0200
+++ 2.txt      2006-09-29 17:57:54.000000000 +0200
@@ -1,3 +1,4 @@
+tą linię dodaliśmy
raz
dwa
trzy
@@ -5,8 +6,6 @@
pięć
sześć
siedem
-te dwie linie
-usuniemy
osiem
dziewięć
dziesięć
@@ -14,5 +13,5 @@
dwanaście
trzynaście
czternaście
-tą linię zmodyfikujemy
+tą linię zmodyfikowaliśmy
piętnaście
bashtest@host:~$
</pre>


== Wyszukiwanie ==
== Wyszukiwanie ==
Linia 356: Linia 481:
! Polecenie !! Opis
! Polecenie !! Opis
|-
|-
| grep || przeszukiwanie zawartości plików
| <code>grep</code> || przeszukiwanie zawartości plików
|-
|-
| find || wyszukiwanie plików/katalogów
| <code>find</code> || wyszukiwanie plików/katalogów
|}
|}


=== grep ===
=== grep ===


Polecenie '''grep''' zostanie dokładniej omówione przy okazji wyrażeń regularnych.
Polecenie <code>grep</code> zostanie dokładniej omówione przy okazji [[Środowisko_programisty/Wyrażenia_regularne|wyrażeń regularnych]].


=== find ===
=== find ===


Polecenie '''find''' w sposób rekurencyjny wyszukuje pliki w podanych katalogach według podanego kryterium i opcjonalnie wykonuje podane polecenia dla znalezionych plików. Możliwości tworzenia kryteriów są dosyć rozbudowane, więc podamy tylko kilka przykładów wykorzystujących tylko niektóre opcje.
Polecenie <code>find</code> w sposób rekurencyjny wyszukuje pliki w podanych katalogach według zadanego kryterium i opcjonalnie wykonuje podane polecenia dla znalezionych plików. Możliwości tworzenia kryteriów są dosyć rozbudowane, więc podamy tylko kilka przykładów wykorzystujących tylko niektóre opcje.


Najczęściej '''find''' służy po prostu do szukania plików. Na przykład, aby znaleźć wszystkie zwykłe pliki (wyłączając katalogi) o rozszerzeniach '''c''', '''cpp''' i '''h''' w katalogu '''kat''', można użyć polecenie:
Najczęściej <code>find</code> służy po prostu do szukania plików. Na przykład, aby znaleźć wszystkie zwykłe pliki (wyłączając katalogi) o rozszerzeniach <code>c</code>, <code>cpp</code> i <code>h</code> w katalogu <code>kat</code>, można użyć polecenia:
  find kat -type f \( -name "*.c" -o -name "*.cpp" -o -name "*.h" \)
  find kat -type f \( -name "*.c" -o -name "*.cpp" -o -name "*.h" \)
Opcja '''-type f''' powoduje, że wyświetlone będą tylko pliki. Następny warunek, który musi być spełniony, aby dany plik był wyświetlony znajduje się w nawiasach. Są to trzy opcje '''-name''', określające możliwe rozszerzenia, połączone opcjami '''-o''', która pełni rolę logicznego operator OR.
Opcja <code>-type f</code> powoduje, że wyświetlone będą tylko pliki. Następny warunek, który musi być spełniony, aby dany plik był wyświetlony znajduje się w nawiasach. Są to trzy opcje <code>-name</code>, określające możliwe rozszerzenia, połączone opcjami <code>-o</code>, które pełnią rolę logicznego operatora OR.


Jest szereg opcji kontrolujących format wyświetlania znalezionych plików. Na przykład
Jest szereg opcji kontrolujących format wyświetlania znalezionych plików. Na przykład
Linia 377: Linia 502:
wyświetli samą nazwę pliku bez ścieżki do katalogu, w którym dany plik się znajduje.
wyświetli samą nazwę pliku bez ścieżki do katalogu, w którym dany plik się znajduje.


'''find''' może być używany do usuwania plików.
<code>find</code> może być używany do usuwania plików.
  find kat -type f \( -name "*~" -p -name "*.bak" \) -delete
  find kat -type f \( -name "*~" -p -name "*.bak" \) -delete
usuwa rekurencyjnie wszystkie pliki backupowe z katalogu '''kat'''.
usuwa rekurencyjnie wszystkie pliki backupowe z katalogu <code>kat</code>.


Można też kazać wykonać jakieś polecenie, które operuje na znalezionych plikach.
Można też kazać wykonać jakieś polecenie, które operuje na znalezionych plikach.
  find kat -name dok.txt -exec bash -c 'echo -e "\nAutor: Jan Kowalski" >> {}' \;
  find kat -name dok.txt -exec bash -c 'echo -e "\nAutor: Jan Kowalski" >> {}' \;
Powyższe polecenie dla każdego z wszystkich plików o nazwie '''dok.txt''' znajdujących się w katalogu '''kat''' doda na koniec pliku podpis
Powyższe polecenie dla wszystkich plików o nazwie <code>dok.txt</code> znajdujących się w katalogu <code>kat</code> doda na koniec pliku podpis
   
   
  Autor: Jan Kowalski
  Autor: Jan Kowalski
Opcja '''-c''' dla polecenia '''bash''' powoduje wykonanie argumentu w nowym shellu. Tym argumentem jest polecenie
Opcja <code>-c</code> dla polecenia <code>bash</code> powoduje wykonanie argumentu w nowym shellu. Tym argumentem jest polecenie
  echo -e "\nAutor: Jan Kowalski" >> {}
  echo -e "\nAutor: Jan Kowalski" >> {}
gdzie symbol '''{}''' polecenie '''find''' zastępuję nazwą znalezionego pliku wraz ze ścieżką.
gdzie symbol <code>{}</code> polecenie <code>find</code> zastępuję nazwą znalezionego pliku wraz ze ścieżką.


== Procesy ==
== Procesy ==
Linia 397: Linia 522:
! Polecenie !! Opis
! Polecenie !! Opis
|-
|-
| ps || wyświetlanie procesów
| <code>ps</code> || wyświetlanie procesów
|-
|-
| kill/killall || kończenie procesów
| <code>kill</code>/<code>killall</code> || kończenie procesów
|-
|-
| top || "menadżer zadań"
| <code>top</code> || "menadżer zadań"
|-
|-
| fg/bg/jobs/^Z || operowanie na zadaniach w shellu
| <code>fg</code>/<code>bg</code>/<code>jobs</code>/<code>^Z</code> || operowanie na zadaniach w shellu
|}
|}


=== ps ===
=== ps ===


Do wyświetlania procesów, które znajdują się w systemie, służy polecenie '''ps'''. Z procesem jest związanych wiele parametrów. '''ps''' pozwala za pomocą najróżniejszych opcji wyświetlać wybrane parametry i procesy. Najczęściej jednak używamy formy
Do wyświetlania procesów, które znajdują się w systemie, służy polecenie <code>ps</code>. Z procesem jest związanych wiele parametrów. <code>ps</code> pozwala za pomocą najróżniejszych opcji wyświetlać wybrane parametry i procesy. Najczęściej jednak używamy formy
  ps ax,
  ps ax,
która wyświetla wszystkie procesy w systemie wraz z paroma najistotniejszymi informacjami:
która wyświetla wszystkie procesy w systemie wraz z paroma najistotniejszymi informacjami:
Linia 418: Linia 543:
   5932 pts/2    R+    0:00 ps ax
   5932 pts/2    R+    0:00 ps ax
  bashtest@host:~$
  bashtest@host:~$
W pierwszej kolumnie jest '''pid''' procesu. Jest to liczba będąca jednoznacznym identyfikatorem procesu. W ostatniej kolumnie jest polecenie, jakim został uruchomiony dany proces. W przedostatniej czas zużycia procesora przez dany proces. Najistotniejsza dla nas jest pierwsza i ostatnia kolumna.
W pierwszej kolumnie jest <code>pid</code> procesu. Jest to liczba będąca jednoznacznym identyfikatorem procesu. W ostatniej kolumnie jest polecenie, z jakim został uruchomiony dany proces. W przedostatniej czas zużycia procesora przez dany proces. Najistotniejsza dla nas jest pierwsza i ostatnia kolumna.


=== kill ===
=== kill ===


Znając identyfikator procesu możemy go zakończyć, używając polecenia '''kill'''. Na przykład
Znając identyfikator procesu możemy go zakończyć, używając polecenia <code>kill</code>. Na przykład
  kill 5691
  kill 5691
powinno zakończyć program '''mc'''.
powinno zakończyć program <code>mc</code>.


=== top ===
=== top ===


Polecenie '''top''' pokazuje w sposób interaktywny aktualne procesy w systemie. Informuje nas o zużyciu procesorów i dostępnej pamięci. Komendy podajemy z klawiatury. Podstawową komendą jest klawisz '''Q''', który powoduje wyjście z programu.
Polecenie <code>top</code> pokazuje w sposób interaktywny aktualne procesy w systemie. Informuje nas o zużyciu procesorów i dostępnej pamięci. Komendy podajemy z klawiatury. Podstawową komendą jest klawisz <code>Q</code>, który powoduje wyjście z programu.


=== Uruchamianie w tle ===
=== Uruchamianie w tle ===


Dodanie na końcu polecenia znak '''&''' powoduje, że polecenie zostanie uruchomione w tle, dzięki czemu, niezależnie od tego, jak długo trwa wykonanie danego polecenia, natychmiast wracamy do linii poleceń i możemy od razu wpisywać następne polecenie.
Dodanie na końcu polecenia znaku <code>&</code> powoduje, że polecenie zostanie uruchomione w tle, dzięki czemu, niezależnie od tego, jak długo trwa wykonanie danego polecenia, natychmiast wracamy do linii poleceń i możemy od razu wpisywać następne polecenie.
  bashtest@host:~$ sleep 999 &
  bashtest@host:~$ sleep 999 &
  [1] 5994
  [1] 5994
Linia 441: Linia 566:
=== jobs ===
=== jobs ===


Do wyświetlenia listy wszystkich poleceń wykonywanych w tle w tym shellu służy polecenie '''jobs''':
Do wyświetlenia listy wszystkich poleceń wykonywanych w tle w tym shellu służy polecenie <code>jobs</code>:
  bashtest@host:~$ jobs
  bashtest@host:~$ jobs
  [1]-  Running                sleep 999 &
  [1]-  Running                sleep 999 &
Linia 448: Linia 573:
  done &
  done &
  bashtest@host:~$  
  bashtest@host:~$  
Można zobaczyć za pomocą polecenia '''top''', że drugie polecenie zajmuje znaczący czas procesora.
Można zobaczyć za pomocą polecenia <code>top</code>, że drugie polecenie zajmuje znaczący czas procesora.


=== fg ===
=== fg ===
Linia 458: Linia 583:
  done
  done
   
   
Wtedy polecenie jest dalej wykonywane, ale już w taki sposób, jakby było uruchomione bez znaku '''&''' na końcu. '''fg''' pobiera numer polecenia ze swojego argumentu, a jeśli jest uruchomione bez argumentu, to bierze ostatnie polecenie w tle i ustawia je jako aktualne.  
Wtedy polecenie jest dalej wykonywane, ale już w taki sposób, jakby było uruchomione bez znaku <code>&</code> na końcu. <code>fg</code> pobiera numer polecenia ze swojego argumentu, a jeśli jest uruchomione bez argumentu, to bierze ostatnie polecenie w tle i ustawia je jako aktualne.  


=== Wstrzymywanie polecenia ===
=== Wstrzymywanie polecenia ===


Z kolei aktualnie wykonywane polecenie możemy przenieść do poleceń wykonujących się w tle wciskając '''Control-Z'''.
Z kolei aktualnie wykonywane polecenie możemy przenieść do poleceń wykonujących się w tle wciskając <code>Ctrl-Z</code>.
  [2]+  Stopped                while true; do
  [2]+  Stopped                while true; do
     :;
     :;
Linia 471: Linia 596:
=== bg ===
=== bg ===


Aby wznowić działanie tego polecenia można użyć polecenia '''bg''':
Aby wznowić działanie tego polecenia można użyć polecenia <code>bg</code>:
  bashtest@host:~$ bg 2
  bashtest@host:~$ bg 2
  [2]+ while true; do
  [2]+ while true; do
Linia 477: Linia 602:
  done &
  done &
  bashtest@host:~$  
  bashtest@host:~$  
Teraz polecenie to działa w tle tak jakby było uruchomione ze znakiem '''&'''.
Teraz polecenie to działa w tle tak jakby było uruchomione ze znakiem <code>&</code>.


=== Usuwanie poleceń ===
=== Usuwanie poleceń ===


Aby zakończyć procesy w tle, można użyć polecenia kill. Można wykorzystać to, że polecenia aktualnie wykonywane można przerywać wciskając '''Control-C'''. Zatem wystarczy polecenie w tle uczynić aktualnym i wcisnąć tę kombinację klawiszy:
Aby zakończyć procesy w tle, można użyć polecenia <code>kill</code>. Można wykorzystać to, że polecenie aktualnie wykonywane można przerywać wciskając <code>Ctrl-C</code>. Zatem wystarczy polecenie w tle uczynić aktualnym i wcisnąć tę kombinację klawiszy:
  bashtest@host:~$ fg 2
  bashtest@host:~$ fg 2
  while true; do
  while true; do
Linia 491: Linia 616:
  bashtest@host:~$
  bashtest@host:~$


Jeżeli nie chcemy wykonywać żadnych czynności zanim nie skończą się wszystkie polecenia w tle, możemy użyć polecenia '''wait''':
Jeżeli nie chcemy wykonywać już żadnych czynności, do czasu aż skończą się wszystkie polecenia w tle, możemy użyć polecenia <code>wait</code>:
  bashtest@host:~$ wait
  bashtest@host:~$ wait
  [1]+  Done                    sleep 999
  [1]+  Done                    sleep 999
  bashtest@host:~$
  bashtest@host:~$
W tym przykładzie czekanie trwało nieco mniej niż 999 sekund. Oczywiście możemy czekać tylko na wybrane polecenia w tle, podając ich numery jako argumenty poleceniu wait.
W tym przykładzie czekanie trwało nieco mniej niż 999 sekund. Możemy czekać tylko na wybrane polecenia w tle, podając ich numery jako argumenty poleceniu <code>wait</code>.
 
== Zmienne środowiskowe ==

Aktualna wersja na dzień 11:26, 30 wrz 2006

Okno terminala

Lista poleceń operujących na terminalu
Polecenie Opis
echo wypisywanie na ekran
sleep zawieszanie wykonania
clear czyszczenie okna
reset resetowanie terminala

echo

Polecenie echo służy do wypisywania swoich argumentów.

Wybrane opcje

-n nie przechodzi do następnej linii
-e interpretacja znaków specjalnych (ze znakiem \)

Przy użyciu opcji -e rozpoznawane są znaki specjalne (poprzedzone \), na przykład

\\ znak \
\a sygnał dźwiękowy
\b znak w tył (backspace)
\n nowa linia
\r powrót karetki, tzn. kursor jest przesuwany do początku linii
\t znak tabulacji

Przykłady

bashtest@host:~$ echo -e 'abc\rdef'
def
bashtest@host:~$ echo -n who; echo -n am; echo -n x; echo -en '\b'; echo i
whoami
bashtest@host:~$ echo -e "Linia 1\nLinia 2"
Linia 1
Linia 2
bashtest@host:~$

Początkowo może być niejasne, co oznacza wywołanie echo -en '\b'. Otóż jest to konwencja podawania opcji w sposób skrócony. Zamiast pisać -e -n możemy skrócić te dwie opcje do -en. Konwencji skrótowej można używać we wszystkich przedstawionych tutaj narzędziach. Więcej o tej konwencji można przeczytać w man 3 getopt.

sleep

Polecenie sleep bierze jeden argument, liczbę całkowitą i czeka właśnie tyle sekund. Na przykład sleep 60 czeka minutę. Polecenie to jest przydatne w skryptach lub w pętlach, gdy między jedną, a drugą czynnością potrzebujemy odstępu czasowego.

clear

Czyści ekran. Przydatne przed wykonaniem polecenia, które wypisuje dużą ilość komunikatów i nie chcemy, aby zlewało nam się z poprzednimi komunikatami.

reset

Resetuje terminal. Podobnie jak clear czyści też ekran, ale również przywraca ustawienia terminala. Przydatne w przypadku, gdy zmienimy ustawienia terminala tak, że nie jesteśmy w stanie na nim pracować, na przykład po tym, gdy każemy wypisać (przez nie uwagę) plik binarny.

Operowanie na plikach i katalogach

Lista poleceń do operowania na plikach i katalogach
Polecenie Opis
cd zmiana katalogu
pwd bieżący katalog
ls lista plików i katalogów
mkdir tworzenie katalogu
cp kopiowanie plików/katalogów
rm usuwanie plików/katalogów
mv przenoszenie/zmiana nazwy pliku/katalogu
cat wypisanie zawartości pliku
more/less przeglądanie zawartości pliku
touch uaktualnianie daty pliku, bądź tworzenie pliku
df wyświetla ilość wolnego miejsca na wszystkich dyskach
du wyświetla zużycie dysku w wybranych katalogach

cd

cd zmienia aktualny katalog na katalog podany w argumencie polecenia. Wywołanie cd bez argumentów zmienia katalog na katalog domowy aktualnego użytkownika.

Bash wprowadza również katalogi specjalne z użyciem znaku ~. Nazwy zaczynające się od znaku ~ (nie ujęte w cudzysłowy) mają specjalne znaczenie, na przykład:

~ katalog domowy aktualnego użytkownika
~/kat1 katalog kat1 w katalogu domowym aktualnego użytkownika
~ktos katalog domowy użytkownika o loginie ktos
~ktos/kat1/kat2 katalog kat1/kat2 w katalogu domowym użytkownika o loginie ktos

Przypomnijmy, że są też następujące katalogi:

. bieżący katalog
.. katalog nadrzędny
/ katalog główny

ls

Służy do wyświetlania zawartości wybranych katalogów. Wyświetlane są informacje o plikach podanych w argumentach i zawartości katalogów podanych w argumentach. Jeżeli nie został podany żaden plik ani katalog, wyświetlana jest zawartość bieżącego katalogu.

Wybrane opcje

Komenda ls może przyjmować wiele argumentów, które głównie dotyczą formatowania wyjścia. Przedstawiamy tylko opcje najczęściej używane.

-R wyświetla zawartość katalogów rekurencyjnie
-a wyświetla wszystkie pliki, również pliki ukryte; w Linuksie pliki ukryte to takie, które zaczynają się od kropki
-l wyświetla dokładną informację o każdym z plików (atrybuty, rozmiar, datę modyfikacji, itp.)

mkdir

Tworzy katalog podany jako argument. Z opcją -p tworzy również katalogi, które są potrzebne do utworzenia katalogu docelowego. Na przykład jeśli wywołamy

mkdir kat1/kat2

to, aby utworzyć kat2, musi istnieć kat1, a jeśli wywołamy

mkdir -p kat1/kat2

to, jeśli nie istnieje kat1, to jest tworzony i dopiero potem następuje utworzenie kat2 w katalogu kat1.

cp

Zasadniczo są trzy najczęściej stosowane wywołania komendy cp:

cp plik1 plik2
kopiuje plik1 i zapisuje go jako plik2, jeśli plik2 istnieje, to go nadpisuje,
cp plik1 ... plikn katalog
kopiuje pliki do katalogu, jeśli jakiś plik istnieje już w katalogu docelowym, to zostaje on nadpisany,
cp -a katalog1 katalog2
kopiuje rekurencyjnie katalog1 wraz zawartością; jeśli katalog2 istnieje, to kopia katalog1 zostanie umieszczona w tym katalogu, tzn. po wykonaniu tej operacji w katalog2 będzie katalog1 wraz zawartością; jeśli katalog2 nie istnieje, to kopia zawartości katalog1 znajdzie się w katalog2, tzn. katalog2 zostanie utworzony, a zawartość katalog1 będzie skopiowana do katalog2.

Jeśli chcemy, aby cp pytało nas, czy nadpisywać istniejące już pliki, to dodajemy opcję -i. Jeżeli taki tryb mamy ustawiony domyślnie, to możemy też chcieć, aby cp pytało nas, czy nadpisywać istniejące już pliki, wtedy dodajemy opcję -f.

rm

To polecenie usuwa wszystkie pliki, które są podane jako argumenty. Jeżeli chcemy usunąć też katalogi, to możemy użyć opcji -r. Opcji tej należy używać raczej ostrożnie, gdyż usuwa ona rekurencyjnie zawartość katalogów.

Możemy poprosić o pytanie przed usunięcie każdego pliku dodając opcję -i. Możemy także poprosić o to, aby nie pojawiały się żadne pytania dodając opcję -f. Przy tej opcji trzeba zachować ostrożność, szczególnie gdy używamy ją łącznie z opcją -r.

Do usuwania katalogów bezpieczniej jest stosować polecenie rmdir, które usuwa katalog tylko, gdy jest on pusty.

mv

To polecenie ma trzy możliwe sposoby wywołania:

mv plik1 plik2
zmienia nazwę plik1 na plik2 (jak jest taka potrzeba wykonane jest także przeniesienie pomiędzy katalogami),
mv plik_lub_katalog1 ... plik_lub_katalogn katalog
w tej wersji katalog podany w ostatnim argumencie musi istnieć; wszystkie pliki i katalogi są przenoszone do tego katalogu,
mv katalog1 katalog2
jeśli katalog2 nie istnieje, to zmieniana jest nazwa podobnie jak przy pierwszym sposobie wywołania; jeśli katalog2 istnieje, to zachowanie jest takie samo jak w poprzednim sposobie wywołania.

Podobnie jak przy poleceniu cp możemy dodawać opcję -i lub -f aby ustawić opcję potwierdzania nadpisywania istniejących plików.

cat

Przy braku argumentów cat po prostu kopiuje standardowe wejście na standardowe wyjście. Przy jednym argumencie wypisuje zawartość pliku o podanej nazwie na standardowe wyjście. Przy większej liczbie argumentów cat wypisuje na standardowe wyjście wszystkie pliki w kolejności, w jakiej zostały one podane. W ten sposób możemy łączyć kilka plików w jeden.

Wywołanie

bashtest@host:~$ cat plika plikb plikc > plik

jest równoważne wykonaniu ciągu poleceń

bashtest@host:~$ cat plika > plik
bashtest@host:~$ cat plikb >> plik
bashtest@host:~$ cat plikc >> plik

Łącznie z poleceniem split można użyć tej możliwości do przenoszenia dużych plików w kawałkach przez mniejsze media. Pokażemy to na przykładzie. Załóżmy, że przenosimy plik cdimage.iso. Dzielimy go wpierw na części:

bashtest@host:~$ ls -l
-rw-r--r-- 1 bashtest users 495605760 2006-08-11 17:53 cdimage.iso
bashtest@host:~$ split -b 120m cdimage.iso 
bashtest@host:~$ ls -l
-rw-r--r-- 1 bashtest users 495605760 2006-08-11 17:53 cdimage.iso
-rw-r--r-- 1 bashtest users 125829120 2006-08-11 17:54 xaa
-rw-r--r-- 1 bashtest users 125829120 2006-08-11 17:55 xab
-rw-r--r-- 1 bashtest users 125829120 2006-08-11 17:56 xac
-rw-r--r-- 1 bashtest users 118118400 2006-08-11 17:57 xad
bashtest@host:~$

Powstały pliki xaa, xab, xac, xad. Można było użyć drugiego argumentu przy poleceniu split, aby przedrostek był więcej mówiący niż przedrostek x. Teraz przenosimy pliki x*, na przykład przy użyciu czterech dysków USB o pojemności 128MB, na inny komputer, nagrywamy je do jednego katalogu i poleceniem cat z powrotem łączymy w jeden plik.

bashtest@host:~$ ls -l x*
-rw-r--r-- 1 bashtest users 125829120 2006-08-11 18:10 xaa
-rw-r--r-- 1 bashtest users 125829120 2006-08-11 18:15 xab
-rw-r--r-- 1 bashtest users 125829120 2006-08-11 18:20 xac
-rw-r--r-- 1 bashtest users 118118400 2006-08-11 18:25 xad
bashtest@host:~$ cat x* > cdimage.iso
bashtest@host:~$ rm -f x*
bashtest@host:~$ ls -l cdimage.iso 
-rw-r--r-- 1 bashtest users 495605760 2006-08-11 18:30 cdimage.iso
bashtest@host:~$

more/less

Narzędzia more i less służą do wygodnego przeglądania pliku, bądź standardowego wejścia. Jeśli mają one podany argument, to przeglądają plik o podanej nazwie. Uruchomione bez argumentów przeglądają to, co dostają na standardowym wejściu.

Podstawowa różnica między tymi komendami jest taka, że more pozwala przeglądać pliki tylko w przód, podczas gdy less pozwala przeglądać je również do tyłu. Przeglądanie odbywa sie przy użyciu intuicyjnej klawiatury (tj. strzałek).

Najczęściej wykorzystuje się less w sytuacji, gdy jakiś program wyrzuca bardzo dużo informacji na standardowe wyjście. Jednym rozwiązaniem jest przekierowanie wyjścia do pliku i później przejrzenie pliku za pomocą jakiegoś edytora bądź polecenia less. Inną możliwością jest użycie potoku. Na przykład:

bashtest@host:~$ ls -lR / | less

Jeśli polecenie wypluwa też dużo na standardowe wyjście diagnostyczne, to można przekierować je na zwykłe standardowe wyjście, używając przekierowania 2>&1:

bashtest@host:~$ ls -lR / 2>&1 | less

w ten sposób obejrzymy zarówno to, co idzie na standardowe wyjście, jak i standardowe wyjście diagnostyczne.

du

Wyświetla zużycie pojemności dysku dla każdego katalogu rekurencyjnie dla podanych argumentów. Jeśli brakuje argumentów, to przegląda katalog bieżący. Polecenie to jest przydatne do policzenia sumarycznej zajętości dysku (opcja -s) albo do przejrzenia rozmiarów podkatalogów danego katalogu (opcja --max-depth=1).

Operowanie na plikach tekstowych

Lista poleceń do operowania na plikach tekstowych
Polecenie Opis
head wypisanie początku pliku
tail wypisanie końca pliku
wc zliczanie znaków/słów/linii
cut wypisywanie wybranych części z każdej linii
tr zamienianie/usuwanie znaków
sort sortowanie po liniach
uniq usuwanie/znajdywanie powtarzających się linii
tac wypisanie plików od tyłu
diff porównywanie dwóch plików

head

Wypisuje początkowe fragmenty plików, których nazwy zostały podane jako argumenty. Jeśli nie zostały podane argumenty, to czyta ze standardowego wejścia. Domyślnie jest to 10 pierwszych linii. Podając opcję -N, gdzie N jest liczbą, head wyświetli N pierwszych linii.

tail

Polecenie podobne do head, z tą różnicą, że wypisuje końcowe fragmenty pliku. Ma identyczne opcje jak head.

wc

Zlicza liczbę znaków, słów i linii w plikach podanych jako argumenty, bądź przy braku argumentów statystyki te liczy dla standardowego wejścia. Można wybrać, którą statystykę chcemy dostać podając jedną z opcji:

-c liczenie tylko znaków
-w liczenie tylko słów
-l liczenie tylko linii

Ćwiczenie

Wypisać liczbę linii podanego pliku, ale jeśli jest to więcej niż 20, to wypisać 20.

cut

Wypisuje wybrane części linii plików podanych w argumentach na standardowe wyjście. W przypadku braku argumentów czyta ze standardowego wejścia.

Każdą linię dzielimy na pola za pomocą znaku zwanego separatorem. Domyślnie jest to znak tabulacji. Separator można podawać za pomocą opcji -d. Na przykład, dla linii

jkow,Jan Kowalski,1990,,Warszawa

i dla separatora , pola są następujące:

nr pola zawartość (w cudzysłowach)
1 "jkow"
2 "Jan Kowalski"
3 "1990"
4 ""
5 "Warszawa"

Polecenie cut pozwala wybrać, które pola chcemy wybrać. Listę pól podajemy przy opcji -f. Lista pól składa się z zakresu lub kilku zakresów oddzielonych przecinkami. Zakres jest albo liczbą N oznaczającą N-te pole, albo przedziałem otwartym z lewej -N oznaczającym pola od 1 do N, albo przedziałem otwartym z prawej N- oznaczającym pola od N do ostatniego, albo wreszcie przedziałem N-M oznaczającym pola od N do M.

bashtest@host:~$ cat baza.txt 
jkow,Jan Kowalski,1990,,Warszawa
tnow,Tomasz Nowak,,,
gbrz,Grzegorz Brzęczyszczykiewicz,,Golfista,Trąbki Wielkie
rkub,Robert Kubica,1985,Kierowca Formuły 1,Kraków
bashtest@host:~$ cut -d , -f 2 baza.txt
Jan Kowalski
Tomasz Nowak
Grzegorz Brzęczyszczykiewicz
Robert Kubica
bashtest@host:~$ cut -d , -f 1,3- baza.txt
jkow,1990,,Warszawa
tnow,,,
gbrz,,Golfista,Trąbki Wielkie
rkub,1985,Kierowca Formuły 1,Kraków
bashtest@host:~$ cut -d , -f 2-4 baza.txt
Jan Kowalski,1990,
Tomasz Nowak,,
Grzegorz Brzęczyszczykiewicz,,Golfista
Robert Kubica,1985,Kierowca Formuły 1
bashtest@host:~$

Jak dla powyższego pliku baza.txt wyodrębnić same nazwiska? Trzeba użyć polecenie cut dwukrotnie:

bashtest@host:~$ cut -d , -f 2 baza.txt | cut -d ' ' -f 2
Kowalski
Nowak
Brzęczyszczykiewicz
Kubica
bashtest@host:~$

Zauważmy, że cut słabo się nadaje do zadań typu podaj trzecie słowo, przy czym słowa mogą być rozdzielane dowolną liczbą białych znaków. Dla cut z użyciem spacji jako separatora, każde pojawienie się spacji oznacza wystąpienie nowego pola. W takich sytuacjach wygodniejsze staje się użycie programu awk. Na przykład

awk '{print $3;}'

wypisze dla każdej linii trzecie słowo.

Ćwiczenie

W pliku /etc/passwd zapisane są informacje o użytkownikach systemu. Należy wypisać imiona i nazwiska użytkowników. Więcej informacji można znaleźć w man 5 passwd lub poprzez analizę podanego pliku.

tr

Jest to narzędzie, za pomocą którego można zmieniać i usuwać znaki. Polecenie to czyta ze standardowego wejścia i wynik wypisuje na standardowe wyjście.

Do zmieniania znaków używamy formy:

tr łańcuch1 łańcuch2

Działa to tak, że znak występujący na i-tym miejscu w łańcuch1 jest zastępowany znakiem występującym na i-tym miejscu w łańcuch2. Na przykład

tr abc xyz

zamieni każde a na wejściu na x, b na y i c na z.

Do usuwania znaków służy

tr -d łańcuch1

Z wejścia są usuwane wszystkie znaki, które znajdują się w łańcuch1. Na przykład

tr -d ';@'

usunie z wejścia wszystkie wystąpienia znaku ; i @. Jeśli dodamy opcję -c, spowoduje to branie wszystkich znaków nie znajdujących się w łańcuch1. Na przykład

tr -cd 0123456789

usunie wszystkie znaki poza cyframi.

tr ma też parę innych funkcji, o których można przeczytać sobie w dokumentacji.

sort

sort sortuje linie z podanych plików lub ze standardowego wejścia i wypisuje na standardowe wyjście. Domyślnie linie są porównywane leksykograficznie, ale jest szereg opcji kontrolujących sposób porównywania linii. Przykładem jest opcja -n, która powoduje, że linie porównywane są numerycznie, tzn. porównywane są liczby występujące na początku linii.

uniq

Usuwa powtarzające się po sobie identyczne linie. Polecenie to jest zazwyczaj stosowane w potoku po komendzie sort.

tac

Polecenie działa podobnie jak cat z tą różnicą, że linie podane na wejściu są wypisywane od tyłu. Przydaje się do odwracania plików.

Ćwiczenie

Załóżmy, że mamy plik z logiem z przebiegu rozwiązanych problemów. Log składa się linii postaci:

identyfikator_problemu czas_rozwiązania

Identyfikatorem problemów jest jeden wyraz. Czas rozwiązania jest liczbą podaną z dokładnością do trzech miejsc po przecinku. Przykładowa zawartość pliku:

KADRY 13.370
BILE 11.510
SOLE 17.010
KODY 13.370

Chcemy wiedzieć ile problemów jesteśmy w stanie rozwiązać dla danego limitu czasowego. Należy na wyjściu wypisać plik składający się z linii

liczba_rozwiązanych_problemów limit_czasowy

posortowanych po limicie czasowym. Przy czym limitami czasowymi są wszystkie możliwe czasy, które pojawiły się w pliku wejściowym. Na przykład dla powyższego pliku wynikiem powinno być:

1 11.510
3 13.370
4 17.010

Wskazówka: przydatne jest polecenie nl.

Rozwiązanie .

diff

Polecenie

diff plik1 plik2

porównuje dwa pliki i opisuje na standardowym wyjściu czym się różni plik2 od plik1. Opis składa się z informacji, które linie trzeba usunąć, które dodać, a które zmodyfikować, aby z plik1 otrzymać plik2.

Spójrzmy na przykład. Mamy dwa pliki tekstowe.

1.txt 2.txt
raz
dwa
trzy
cztery
pięć
sześć
siedem
te dwie linie
usuniemy
osiem
dziewięć
dziesięć
jedenaście
dwanaście
trzynaście
czternaście
tą linię zmodyfikujemy
piętnaście
tą linię dodaliśmy
raz
dwa
trzy
cztery
pięć
sześć
siedem
osiem
dziewięć
dziesięć
jedenaście
dwanaście
trzynaście
czternaście
tą linię zmodyfikowaliśmy
piętnaście

Dla tych plików wynik jest taki:

bashtest@host:~$ diff 1.txt 2.txt 
0a1
> tą linię dodaliśmy
8,9d8
< te dwie linie
< usuniemy
17c16
< tą linię zmodyfikujemy
---
> tą linię zmodyfikowaliśmy
bashtest@host:~$

Używając opcji -u dostaniemy inny format porównania, który dodatkowo pokazuje kontekst wprowadzonych zmian:

bashtest@host:~$ diff -u 1.txt 2.txt 
--- 1.txt       2006-09-29 17:57:05.000000000 +0200
+++ 2.txt       2006-09-29 17:57:54.000000000 +0200
@@ -1,3 +1,4 @@
+tą linię dodaliśmy
 raz
 dwa
 trzy
@@ -5,8 +6,6 @@
 pięć
 sześć
 siedem
-te dwie linie
-usuniemy
 osiem
 dziewięć
 dziesięć
@@ -14,5 +13,5 @@
 dwanaście
 trzynaście
 czternaście
-tą linię zmodyfikujemy
+tą linię zmodyfikowaliśmy
 piętnaście
bashtest@host:~$

Wyszukiwanie

Lista poleceń do szukania
Polecenie Opis
grep przeszukiwanie zawartości plików
find wyszukiwanie plików/katalogów

grep

Polecenie grep zostanie dokładniej omówione przy okazji wyrażeń regularnych.

find

Polecenie find w sposób rekurencyjny wyszukuje pliki w podanych katalogach według zadanego kryterium i opcjonalnie wykonuje podane polecenia dla znalezionych plików. Możliwości tworzenia kryteriów są dosyć rozbudowane, więc podamy tylko kilka przykładów wykorzystujących tylko niektóre opcje.

Najczęściej find służy po prostu do szukania plików. Na przykład, aby znaleźć wszystkie zwykłe pliki (wyłączając katalogi) o rozszerzeniach c, cpp i h w katalogu kat, można użyć polecenia:

find kat -type f \( -name "*.c" -o -name "*.cpp" -o -name "*.h" \)

Opcja -type f powoduje, że wyświetlone będą tylko pliki. Następny warunek, który musi być spełniony, aby dany plik był wyświetlony znajduje się w nawiasach. Są to trzy opcje -name, określające możliwe rozszerzenia, połączone opcjami -o, które pełnią rolę logicznego operatora OR.

Jest szereg opcji kontrolujących format wyświetlania znalezionych plików. Na przykład

find kat -printf "%f\n"

wyświetli samą nazwę pliku bez ścieżki do katalogu, w którym dany plik się znajduje.

find może być używany do usuwania plików.

find kat -type f \( -name "*~" -p -name "*.bak" \) -delete

usuwa rekurencyjnie wszystkie pliki backupowe z katalogu kat.

Można też kazać wykonać jakieś polecenie, które operuje na znalezionych plikach.

find kat -name dok.txt -exec bash -c 'echo -e "\nAutor: Jan Kowalski" >> {}' \;

Powyższe polecenie dla wszystkich plików o nazwie dok.txt znajdujących się w katalogu kat doda na koniec pliku podpis

Autor: Jan Kowalski

Opcja -c dla polecenia bash powoduje wykonanie argumentu w nowym shellu. Tym argumentem jest polecenie

echo -e "\nAutor: Jan Kowalski" >> {}

gdzie symbol {} polecenie find zastępuję nazwą znalezionego pliku wraz ze ścieżką.

Procesy

We współczesnych systemach operacyjnych może działać wiele procesów na raz. O procesie można myśleć jak o wykonującym się programie. Wywołanie nowego polecenia wiąże się z utworzeniem nowego procesu.

Lista poleceń operujących na procesach
Polecenie Opis
ps wyświetlanie procesów
kill/killall kończenie procesów
top "menadżer zadań"
fg/bg/jobs/^Z operowanie na zadaniach w shellu

ps

Do wyświetlania procesów, które znajdują się w systemie, służy polecenie ps. Z procesem jest związanych wiele parametrów. ps pozwala za pomocą najróżniejszych opcji wyświetlać wybrane parametry i procesy. Najczęściej jednak używamy formy

ps ax,

która wyświetla wszystkie procesy w systemie wraz z paroma najistotniejszymi informacjami:

bashtest@host:~$ ps ax
...
 5613 ?        Ss     0:00 xterm
 5627 pts/2    S      0:03 bash
 5691 pts/0    S+     0:00 mc
 5932 pts/2    R+     0:00 ps ax
bashtest@host:~$

W pierwszej kolumnie jest pid procesu. Jest to liczba będąca jednoznacznym identyfikatorem procesu. W ostatniej kolumnie jest polecenie, z jakim został uruchomiony dany proces. W przedostatniej czas zużycia procesora przez dany proces. Najistotniejsza dla nas jest pierwsza i ostatnia kolumna.

kill

Znając identyfikator procesu możemy go zakończyć, używając polecenia kill. Na przykład

kill 5691

powinno zakończyć program mc.

top

Polecenie top pokazuje w sposób interaktywny aktualne procesy w systemie. Informuje nas o zużyciu procesorów i dostępnej pamięci. Komendy podajemy z klawiatury. Podstawową komendą jest klawisz Q, który powoduje wyjście z programu.

Uruchamianie w tle

Dodanie na końcu polecenia znaku & powoduje, że polecenie zostanie uruchomione w tle, dzięki czemu, niezależnie od tego, jak długo trwa wykonanie danego polecenia, natychmiast wracamy do linii poleceń i możemy od razu wpisywać następne polecenie.

bashtest@host:~$ sleep 999 &
[1] 5994
bashtest@host:~$ while true; do : ; done &
[2] 5995
bashtest@host:~$ 

jobs

Do wyświetlenia listy wszystkich poleceń wykonywanych w tle w tym shellu służy polecenie jobs:

bashtest@host:~$ jobs
[1]-  Running                 sleep 999 &
[2]+  Running                 while true; do
    :;
done &
bashtest@host:~$ 

Można zobaczyć za pomocą polecenia top, że drugie polecenie zajmuje znaczący czas procesora.

fg

Można też wybrane polecenie, które jest wykonywane w tle, ustanowić aktualnie wykonywanym poleceniem.

bashtest@host:~$ fg 2
while true; do
    :;
done

Wtedy polecenie jest dalej wykonywane, ale już w taki sposób, jakby było uruchomione bez znaku & na końcu. fg pobiera numer polecenia ze swojego argumentu, a jeśli jest uruchomione bez argumentu, to bierze ostatnie polecenie w tle i ustawia je jako aktualne.

Wstrzymywanie polecenia

Z kolei aktualnie wykonywane polecenie możemy przenieść do poleceń wykonujących się w tle wciskając Ctrl-Z.

[2]+  Stopped                 while true; do
    :;
done
bashtest@host:~$ 

Teraz polecenie to jest dodatkowo zatrzymane. Można się przekonać, że teraz nie zużywa ono czasu procesora.

bg

Aby wznowić działanie tego polecenia można użyć polecenia bg:

bashtest@host:~$ bg 2
[2]+ while true; do
    :;
done &
bashtest@host:~$ 

Teraz polecenie to działa w tle tak jakby było uruchomione ze znakiem &.

Usuwanie poleceń

Aby zakończyć procesy w tle, można użyć polecenia kill. Można wykorzystać to, że polecenie aktualnie wykonywane można przerywać wciskając Ctrl-C. Zatem wystarczy polecenie w tle uczynić aktualnym i wcisnąć tę kombinację klawiszy:

bashtest@host:~$ fg 2
while true; do
    :;
done

bashtest@host:~$ jobs
[1]+  Running                 sleep 999 &
bashtest@host:~$

Jeżeli nie chcemy wykonywać już żadnych czynności, do czasu aż skończą się wszystkie polecenia w tle, możemy użyć polecenia wait:

bashtest@host:~$ wait
[1]+  Done                    sleep 999
bashtest@host:~$

W tym przykładzie czekanie trwało nieco mniej niż 999 sekund. Możemy czekać tylko na wybrane polecenia w tle, podając ich numery jako argumenty poleceniu wait.