www.blog.proste.to

Podstawy – Poruszanie się w systemie Unix

Struktura katalogów

W Uniksach cały system plików widoczny jest w postaci katalogów umieszczonych w wirtualnym katalogu „/”. Znajdziemy tu takie katalogi jak:

  • /bin – zawierejący podstawowe poleceniakonsoli
  • /etc – zawierający pliki konfiguracyjne systemu
  • /dev – zawierający pliki urządzeń
  • /lib – zawierający podstawowe biblioteki systemowe
  • /sys – zawierający pliki systemowe
  • /usr – zawierający pliki i programy przeznaczone dla użytkowników, w niektórych systemach umieszczane są wewnątrz niego także katalogi domowe użytkowników.
  • /var – zawierający m.in. logi systemowe oraz pliki używane przez tzw. Daemony, czyli aplikacje realizujące usługi systemowe (obsługa poczty, drukarki, itp.)
  • /tmp – katalog plików tymczasowych

W Linuksie znajdziemy także:

  • /root – katalog domowy administratora
  • /sbin – polecenia przeznaczone do użytku administratora
  • /proc – wirtualny katalog zawierający wirtualne pliki z informacjami o stanie systemu i komputera
  • /boot – zawierający m. in. informacje dla programu uruchamiającego jądro (LILO, Grub)
  • /home – katalog zawierający katalogi domowe użytkowników

Katalog /usr zawiera podobną strukturę jak / – znajdziemy w nim katalogi /usr/bin, /usr/lib, /usr/etc itp. Zazwyczaj w podkatalogach / umieszcza się najważniejsze dla funkcjonowania systemu programy i aplikacje, a w podkatalogach /usr – pozostałe.

Pomoc systemowa

Praktycznie każde polecenie posiada opcję --help, wyświetlającą informacje o składni i dostępnych opcjach, np.:

$ ls --help

Dla większości poleceń istnieją tzw. strony podręcznika systemowego. Napisanie:

$ man polecenie

powinno wyświetlić stronę podręcznika na temat danego polecenia. Należy jednakże zdawać sobie sprawę, że w podręczniku znajdują się także np. opisy poleceń języka C czy opisy funkcji systemowych. Rozróżnia się wtedy polecenia po numerach rozdziału, pisząc:

$ man nr_rozdziału polecenie

Krótkie informacje o danym poleceniu możemy uzyskać pisząc:

$ man polecenie

Informacje o poleceniach zawierających w nazwie jakiś ciąg znaków dostaniemy pisząc:

$ apropos ciąg_znaków

Najbardziej szczegółowe informacje znajdziemy na tzw. stronach info. Wystarczy napisać:

$ info polecenie

Aby opuścić przeglądarkę manuali lub stron info, wystarczy wcisnąć q.

Polecenia związane z plikami i katalogami

pwd

Jeśli przy znaku zachęty nie pojawia się informacja o aktualnym katalogu, możemy jego nazwę wyświetlić pisząc:

$ pwd

cd

Do zmiany aktualnego katalogu służy polecenie cd o składni:

$ cd nazwa_katalogu

Uwaga: warto pamiętać, że w powłoce bash wciśnięcie tabulatora dokańcza nazwy plików. Pozwala to na szybsze wydawanie poleceń.

Jeśli nie podamy parametru, polecenie cd przeniesie nas do naszego katalogu domowego. (Uwaga: jest to istotna różnica w stosunku do DOS/Windows – tam polecenie cd bez parametrów działało jak pwd). Jeśli chcemy przejść do katalogu nadrzędnego, napiszemy:

$ cd ..

ls

Jeśli chcemy wydrukować zawartość danego katalogu, piszemy po prostu:

$ ls nazwa_katalogu

Jeśli pominiemy nazwę, ls wylistuje zawartość katalogu bieżącego. Polecenie to ma wiele parametrów, wśród najważniejszych warto wymienić:

  • -a pokazuje wszystkie pliki, także „ukryte” (tzn. o nazwach rozpoczynających się od
    kropki)
  • -l drukuje szczegółowe informacje o plikach (właściciel, prawa, daty modyfikacji,
    rozmiar)

Opcje z jednym minusem i jedną literą można łączyć – „ls -a -l” odpowiada „ls -al„.

Ciekawą opcją jest --color – jeśli dana wersja ls to obsługuje, różne rodzaje plików są odpowiednio kolorowane (inaczej katalogi, inaczej pliki zwykłe, wykonywalne, multimedialne etc.). Jeśli opcja ta jest domyślnie włączona, a nie chcemy kolorowania(przydatne np. przy pętli for) – ustawiamy ją na none (--color=none).

rm

Do usuwania plików służy polecenie rm:

$ rm nazwa_pliku

Zamiast nazwy pliku można zastosować symbole * i ?, Wówczas warto wymusić potwierdzanie usuwania każdego pliku:

$ rm -i abc*

rmdir

Do usuwania pustych katalogów służy polecenie rmdir:

$ rmdir nazwa_katalogu

Jeśli katalog zawiera pliki lub katalogi – nie zostanie w takiej sytuacji usunięty. Do usuwania katalogów wraz z zawartością, stosujemy odpowiednie opcje polecenia rm:

$ rm -rf nazwa_katalogu

mkdir

Jeśli chcemy założyć nowy katalog, korzystamy z polecenia mkdir:

$ mkdir nazwa_katalogu

Jeśli chcemy utworzyć całe drzewo katalogów, stosujemy opcję -p:

$ mkdir -p raz/dwa/trzy/cztery

Możemy także podać uprawnienia do tworzonego katalogu:

$ mkdir katalog -m 770

Zostanie utworzony katalog z uprawnieniami odczytu, zapisu i wykonywania dla właściciela i grupy oraz bez uprawnień dla pozostałych użytkowników.

mv

Jeśli chcemy przenieść plik do innego katalogu, wykorzystujemy polecenie mv:

$ mv plik katalog

Podobnie postępujemy, gdy zmieniamy nazwę pliku:

$ mv stara_nazwa nowa_nazwa

Uwaga: jeśli plik nowa_nazwa istnieje – zostanie nadpisany bez ostrzeżenia. Ostrzeżenia można włączyć opcją -i. Innym rozwiązaniem jest tworzenie kopii zapasowej nadpisywanego pliku. Polecenie:

$ mv -b jeden dwa

spowoduje zmianę nazwy dwóch plików: „dwa” na „dwa~„, a „jeden” na „dwa„.

Możemy jednocześnie przenieść plik do katalogu ze zmianą nazwy. Jeśli chcemy przenieść z bieżącego katalogu plik „abc” do katalogu „katalog„, zmieniając mu nazwę na „xyz” napiszemy:

$ mv abc katalog/xxx

Dodanie opcji „-i” sprawi, że mv będzie się pytać przed nadpisywaniem plików.

cp

Aby skopiować plik, używamy polecenia cp:

$ cp plik_zrodlowy plik_docelowy

Aby skopiować katalog wraz z zawartością:

$ cp -R katalog_zrodlowy katalog_docelowy

Podobnie jak przy mv, możemy nakazać potwierdzanie przy nadpisywaniu plików – opcja „-i„.

cat

Aby wypisać zawartość pliku na ekran, używamy polecenia cat:

$ cat plik

chmod, chown i chgrp

Do nadawania uprawnień plikom służy polecenie chmod. Istnieją dwa warianty tego polecenia. W pierwszym podajemy uprawnienia jako ciąg cyfr:

$ chmod plik 752

Pierwsza cyfra to uprawnienia dla właściciela pliku, druga to uprawnienia dla grupy w której znajduje się właściciel, a trzecia to uprawnienia pozostałych użytkowników systemu. Poszczególne cyfry to wynik dodawania poszczególnych uprawnień: 1 odpowiada prawu x (wykonywania); 2 – w (zapisu); 4 – r (odczytu).

Tak więc 752 to:

  • prawo wykonywania, zapisu i odczytu dla właściciela;
  • prawo wykonywania i zapisu dla grupy;
  • prawo zapisu dla innych.

Drugi sposób to zapis „komu co”, np.:

$ chmod u+rwx nazwa_pliku

Jeśli mamy prawa administratora, możemy zmienić właściciela pliku:

$ chown inny_uzytkownik plik

Jeśli jesteśmy administratorem lub posiadamy członkostwo w wielu grupach, możemy także zmienić grupę właścicielską:

$ chgrp inna_grupa plik

Katalogi domowe

Jak odwołać się do własnego katalogu domowego, jeśli nie wiemy, gdzie on się znajduje? Istnieją dwa sposoby:

  1. katalog domowy bieżącego użytkownika dostępny jest zawsze jako „~„.
  2. katalog domowy bieżącego użytkownika zawiera się w zmiennej $HOME.

Zatem te polecenia są równoważne:

$ cd ~
$ cd $HOME
$ cd

Jak odwołać się do czyjegoś katalogu domowego? Poprzedzamy nazwę użytkownika symbolem tyldy – “~kasia”. Wówczas nie musimy wiedzieć, czy Kasia ma swój katalog domowy w /home/kasia, /usr/kasia, /Users/Kasia, /usr/users/grupy/grupa1/kasia etc.

Dowiązania twarde i symboliczne („hardlinki” i „symlinki”)

Aby utworzyć dowiązanie twarde do danego pliku piszemy:

$ ln nazwa_pliku nazwa_dowiązania

W tablicy inode’ów zostanie wówczas utworzony drugi wpis wskazujący na dany plik.

Aby utworzyć dowiązanie symboliczne, piszemy:

$ ln -s nazwa_pliku nazwa_dowiązania

W tym wypadku zostanie utworzony plik tekstowy „nazwa_dowiazania” zawierający ścieżkę dostępu do pliku „nazwa_pliku”. Plik ten dostanie dodatkowe uprawnienie „l”, oznaczające, że jest odwołaniem.

Dlaczego symlinki są lepsze od hardlinków? Ponieważ listując zawartość katalogu, od razu widzimy, że dany plik jest dowiązaniem:

$ ln -s plik symlink
$ ln plik hardlink
$ ls -l
razem 1
-rw-r--r--    2 marcoos  users           0 2003-12-17 23:28 hardlink
-rw-r--r--    2 marcoos  users           0 2003-12-17 23:28 plik
lrwxrwxrwx    1 marcoos  users           4 2003-12-17 23:28 symlink -> plik

Archiwizacja danych

Do obsługi plików z archiwami służy przede wszystkim polecenie tar:

Rozpakowanie pliku .tar w bieżącym katalogu:

$ tar -xf plik.tar

Utworzenie archiwum z zawartością katalogu:

$ tar -cf archiwum.tar katalog

Należy pamiętać, że nie jest przeprowadzana żadna kompresja, tworzony jest tylko plik zawierający inne pliki i informacje o ich położeniu.

Kompresja pliku do formatu gzip (powstaje “plik.gz”):

$ gzip plik

Dekompresja pliku .gz:

$ gunzip plik.gz

Analogicznie przebiega kompresja i dekompresja do formatu bzip2 (bzip2, bunzip2).

Można także od razu tworzyć skompresowane archiwa tar:

$ tar -czf archiwum.tar.gz katalog
$ tar -cjf archiwum.tar.bz2 katalog

oraz dekompresować i odpakowywać takie archiwa:

$ tar -xzf archiwum.tar.gz
$ tar -xjf archiwum.tar.bz2

Podczas dekompresji, obecnie, można pominąć parametry -z i -j, tar automatycznie wykryje, z jakim typem kompresji ma do czynienia.

Obsługa dysków

W systemach uniksowych należy zawsze domontować dany dysk, dyskietkę lub płytę do katalogu. Czyni się to poleceniem mount:

$ mount -t typ_systemu_plików /dev/urządzenie /mnt/katalog

Jeśli system jest odpowiednio skonfigurowany, wystarczy:

$ mount /mnt/katalog

Po skończeniu pracy z danym dyskiem należy go odmontować poprzez:

$ umount /mnt/katalog

lub

$ umount /dev/urzadzenie

Polecenie mount domyślnie próbuje zamontować dany napęd w trybie do odczytu i zapisu. Jeśli chcemy zamontować dany dysk tylko do odczytu, należy do tego polecenia dopisać „ro„.

Przykład: Zamontowanie dyskietki w formacie FAT w pierwszej stacji dysków, tylko do odczytu:

$ mount -t vfat /dev/fd0 /mnt/floppy ro

Odmontowanie:

$ umount /dev/fd0

Przykład 2: Zamontowanie płyty CD-ROM:

$ mount -t iso9660 /dev/cdrom /mnt/cdrom ro

Uwaga: to, czy zwykły użytkownik ma prawo montować dyski, zależy od administratora systemu.

Potoki wyjściowe

Wysłanie wyników polecenia do pliku z nadpisaniem pliku…:

$ polecenie > plik

…i bez nadpisania, z dołączaniem do końca pliku:

$ polecenie >> plik

Wysylanie wyników polecenia do pliku „wyniki” a błędów do pliku „err”:

$ polecenie >> wyniki 2>>err

Potoki wejściowe

Pobranie z pliku wartości, które zostaną podane na wejście polecenia:

$ polecenie < plik

Podanie na wejście polecenia2 wyników polecenia1:

$ polecenie1 |  polecenie2

Przykład:

ls -al | less

Polecenie less to ulepszona wersja polecenia more, które dzieli wyjście danego polecenia na strony mieszczące się na ekranie. Następna strona to spacja, można używać klawiszy kursora oraz PgUp, PgDn, Home, End.

Symbol „<<„

Załóżmy, że chcemy na standardowe wejście danego polecenia przekazać jakiś wieloliniowy tekst, który dopiero zamierzamy wprowadzić z klawiatury. Jak to zrobić? Skorzystajmy z symbolu „<<„, umieszczając tuż zanim jakiś znacznik (zwykle pisze się „EOF”):

$ cat >plik << EOF > W Paryżu
> najlepsze kasztany
> są na placu
> Pigalle
> EOF
$ cat plik
W Paryżu
najlepsze kasztany
są na placu
Pigalle

Utworzyliśmy tutaj plik o nazwie „plik” o treści takiej, jaką wprowadziliśmy w kolejnych liniach z klawiatury.

Wyszukiwanie w plikach i plików

Aby wypisać wszystkie linie pliku plik.txt zawierające dane słowo, piszemy:

$ grep slowo plik.txt

Natomiast to polecenie wypisze linie nie zawierające tego słowa:

$ grep -v slowo plik.txt

Jeśli chcemy się dowiedzieć, gdzie znajduje się dane program wykonywalny (dostępny dzięki $PATH), korzystamy z polecenia whereis:

$ whereis vi
vi: /usr/bin/vi

Jeśli chcemy przeszukać system plików wg zadanego kryterium, używamy polecenia find. Ogólna składnia:

$ find gdzie_szukac jakie_kryterium co_zrobic_po_odnalezieniu

Kilka przykładów:

find . -name "html" -print

Wyszuka wszystkei pliki znajdujące się w bieżącym katalogu o nazwach zawierających słowo „html”.

find . -name '*.c' -ok less {} \;

Wyszuka wszystkie pliki .c, przy każdym odnalezionym proponuje wyświetlenie jego zawartości na ekranie.

find . -name '*.c' -exec less {} \;

Podobnie, ale od razu wyświetla pliki, bez potwierdzania.

find /tmp -atime +3 -and -uid +499 -print -exec rm -rf {} \;

Spowoduje skasowanie wszystkich plików, które nie były używane od 3 dni i ich właścicielami są użytkownicy o UID większym niż 499 i znajdującymi się we wszystkich kartotekach od kartoteki /tmp począwszy, informacja o znalezionych plikach zostanie przekazana na monitor.

find /usr/src -type f -exec grep "stdio.h" {} \; -print

Wyszuka wszystkie pliki w katalogu /usr/src zawierające w swojej treści „stdio.h„. Nazwa pliku zostanie wypisana po wszystkich liniach z danego pliku zawierających „stdio.h„.

Praca z procesami

Zazwyczaj praca w bashu jest sekwencyjna – realizujemy polecenie za poleceniem. Ale przecież UNIX jest systemem wielozadaniowym i czasami jednak chcielibyśmy uruchomić jakiś program w tle. W takiej sytuacji korzystamy z symbolu „&”. Przykładowo, chcielibyśmy poleceniem mpg123 odsłuchać plik muzyczny na konsoli, ale jednocześnie mieć dostępną linię poleceń:

$ mpg123 piosenka.mp3 >/dev/null 2>/dev/null  &
$ kolejne_polecenia

 

Co tu zrobiliśmy? Uruchomiliśmy w tle program mpg123 odtwarzający pliki muzyczne mp3, przekierowując do urządzenia /dev/null („czarnej dziury”) tekstowe wyjścia tego programu (żeby nie zaśmiecał nam ekranu swoimi komunikatami). Dzięki temu muzyka gra w tle podczas, gdy możemy na konsoli wykonywać kolejne polecenia.

A co, jeśli uruchomiliśmy jakiś program, którego działanie trwa długo i blokuje nam konsolę? Wciskamy CTRL-Z i program zostaje wstrzymany (nie zamknięty). Jeśli teraz wydamy polecenie:

$ bg

program zostanie „odmrożony”, ale dalej będzie się wykonywał w tle.

Jeśli jednak wpiszemy:

$ fg

powrócimy do tego programu, konsola ponownie będzie zablokowana.

Każdy proces w systemie UNIX ma swój identyfikator (liczbę), tzw. PID (process identifier). Dzięki temu identyfikatorowi zarówno system jak i użytkownik może w pewnym zakresie zarządzać realizowanymi procesami.

Aby zobaczyć listę procesów uruchomionych na aktualnej konsoli, napiszemy:

$ ps
  PID TTY          TIME CMD
6092 pts/1    00:00:00 bash
7304 pts/1    00:00:00 mpg123
7305 pts/1    00:00:00 ps

Widzimy, że bash ma PID 6092, a mpg123 – 7304. Jeśli chcielibyśmy poznać polecenie, jakim uruchomiono dany proces, napisalibyśmy:

$ ps x

Wszystkie „nasze” procesy wylistujemy poleceniem:

$ ps u

Polecenie ps ma znacznie więcej opcji. Ich krótką listę dostaniemy pisząc „ps –help„, warto także przejrzeć podręcznik i strony info.

Aby natychmiast przerwać proces o danym PIDzie, piszemy:

$ kill -9 PID

Aby przerwać wszystkie procesy o danej nazwie, piszemy np.:

$ killall -9 mpg123

Polecenia te przesyłają różne sygnały do procesu, najczęściej są to sygnały wymuszające zakończenie procesu. Sygnał 9. (KILL) jest najbardziej skuteczny – powoduje natychmiastowe przerwanie procesu. Bardziej eleganckie jest wysłanie sygnału 15. (TERM), ale nie zawsze chcemy to zrobić. Sygnałów tego rodzaju może być wiele, a zachowanie danego procesu na dany sygnał także może być różne (z wyjątkiem 9). Często np. sygnał 1 (HUP) bywa wykorzystywany jako rozkaz ponownego odczytania plików konfiguracyjnych przez dany proces.

Spis dostępnych sygnałów otrzymamy pisząc:

$ kill -l

Proces uruchomiony nie w tle (blokujący konsolę) często można przerwać wciskając po prostu Ctrl-C.

Zmienne środowiskowe

Znaczenie niektórych zmiennych środowiskowych przedstawiono poniżej.

  • $PATH – zawiera spis katalogów, pośród których szukane są polecenia
  • $SHELL – zawiera nazwę aktualnej powłoki (np. „/bin/bash”, „/bin/csh” itp.)
  • $USERNAME – zawiera nazwę aktualnego użytkownika
  • $HOSTNAME – nazwa hosta
  • $HOME – zawiera nazwę katalogu aktualnego użytkownika
  • $PS1 – główny znak zachęty
  • $PS2 – drugi znak zachęty
  • $CC – zawiera nazwę domyślnego kompilatora C
  • $CXX – zawiera nazwę domyślnego kompilatora C++
  • $LC_ALL – (w uproszczeniu mówiąc) zawiera ustawienia językowe aktualnego użytkownika.

Jeśli LC_ALL ustawimy na „pl_PL„, system będzie się komunikował z nami w języku polskim (o ile są zainstalowane polskie pakiety lokalizacyjne). Aby powrócić do anglojęzycznej konsoli, ustawiamy LC_ALL na „en_US„:

Przykład:

$ LC_ALL="pl_PL"
$ ls nieistniejacyplik
ls: nieistniejacyplik: Nie ma takiego pliku ani katalogu
$ LC_ALL="en_US"
$ ls nieistniejacyplik
ls: nieistniejacyplik: No such file or directory

Szczegółowy opis wszystkich zmiennych środowiskowych można znaleźć w podręczniku systemowym powłoki bash (man bash).

Aliasy

Jeśli często korzystamy z jakiegoś polecenia, które jest długie lub ma niewygodną składnię, możemy sobie stworzyć tzw. alias. Oto przykład:

$ alias montujfdd="mount -t vfat /dev/fd0 /mnt/floppy ro"

Jeżeli będziemy chcieli usunąć ten alias, piszemy:

$ unalias montujfdd

Aby powłoka pamiętała aliasy, należy je dopisać do .bashrc lub .bashprofile. Aby zobaczyć listę aliasów, wydajmy polecenie alias bez parametrów.

Informacje o użytkownikach

  • who – wyświetla listę zalogowanych użytkowników, nazwy konsoli oraz godzinę od której są zalogowani
  • whoami – wypisuje naszą nazwę użytkownika
  • who am i – wyświetla informacje o nas w sposób taki, jak “who”

Ustawienia konta użytkownika

Jeśli nie chcemy, by bash był naszą domyślną powłoką, możemy to zmienić:

$ chsh -s /bin/jakiś_shell

Aby zmienić hasło na nasze konto, korzystamy z polecenia:

$ passwd

Pliki z kropką w nazwie

Dla powłoki bash istotnych jest kilka plików o nazwach rozpoczynających się od kropki. Oto, do czego służą.

  • ~/.bashrc – Ten skrypt jest wykonywany przy ręcznym uruchomieniu powłoki.
  • ~/.bash_profile – Skrypt uruchamiany przy inicjalizacji powłoki typu login (tzn. uruchomionej przy logowaniu się,a nie ręcznie)
  • ~/.bash_logout – Skrypt uruchamiany przy wychodzeniu z powłoki
  • ~/.bash_history – Plik zawiera historię naszych poleceń

Autor: Marek Stępień (http://blog.marcoos.com/)
Tekst został pierwotnie opublikowany tutaj: http://piast.pertus.com.pl/~marcoos/unix/unix.pdf

NA GÓRĘ