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:
- katalog domowy bieżącego użytkownika dostępny jest zawsze jako „
~
„. - 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ą zalogowaniwhoami
– wypisuje naszą nazwę użytkownikawho 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
Wszystkie części serii:
Artykuł Podstawy – Poruszanie się w systemie Unix pochodzi z serwisu Linux Insider.