Základy příkazové řádky
I když již není znalost unixových příkazů pro soužití s Linuxem natolik důležitá jako dříve, není od věci osvojit si alespoň několik základních příkazů. Důvodem je, že
„klikací“ aplikace pro nastavení systému se mohou lišit pro jednotlivé verze distribuce - příkazy však zůstávají neměnné. Navíc v případě, kdy budete nuceni pracovat např. v záchranném módu, budete odkázáni výhradně na příkazový řádek. Sečteno a podtrženo - znalost několika málo příkazů Vás nezabije, ale posílí (navíc zažije určitě řadu situací, kdy se Vám tato znalost bude i hodit). Jestliže Vás však tato kapitola už od prvního pohledu odpuzuje, můžete ji přeskočit.
V následujícím textu budeme zaměňovat pojmy příkazový řádek a terminál. Příkazovým řádkem / terminálem budeme rozumět rozhraní, pomocí něhož zadává uživatel příkazy. Dalším pojmem, se kterým se zde můžete setkat, je shell. shell je zjednodušeně řečeno software, který umožňuje komunikaci mezi uživatelem a jádrem OS Linux - je totiž zodpovědný za interpertaci příkazů zadávaných uživatelem prostřednictvím příkazového řádku. shell tak brání tomu, aby uživatelé přistupovali přímo k jádru, což lze chápat do jisté míry jako bezpečnostní prvek.
Pro OS Linux bylo vyvinuto několik shellů. Standardním shellem je bash, který bude s největší pravděpodobností také součástí Vaší instalace. bash je akronymem sousloví „Bourne Again SHell“ a je pokračovatelem původního shellu, který napsal Stephen Bourne koncem 70.let. Samotný bash pak pochází z roku 1987.
Dalším hojně používaným pojmem je příkaz. Příkaz není v podstatě nic jiného než soubor, který má nastaveno právo spouštění (viz. kapitola Definování přístupových práv). Většina těchto souborů je pak uložena v adresářích /sbin
, /bin
, /usr/bin
a /usr/sbin
. Jestliže chceme zadat daný příkaz, stačí ve většině případů do příkazové řádky napsat pouze jeho jméno.
ls -la
Je však možné také zadat kompletní cestu.
/bin/ls -la
V případě, že adresář, ve kterém se nachází daný příkaz, není definován v proměnné PATH
, je uvedení celé cesty nezbytné (viz. kapitola Proměnná PATH).
S pojmem příkaz je velice často spojován pojem přepínač. Přepínač lze chápat jako fakultativní parametr, který modifikuje chování příkazu. Jednotlivé přepínače lze velice často mezi sebou kombinovat. Např. v případě příkazu ls
lze použít přepínač -l
, -a
ale také jejich kombinaci -la
.
Poznámka: Zde uvedené příkazy lze označit jako naprosté minimum příkazové řádky - seznam příkazů není ani zdaleka vyčerpávající.
Terminál
Příkazový řádek otevřete v grafickém prostředí Gnome pomocí nabídky Aplikace → Systémové nástroje → Terminál.
V historii zadaných příkazů můžete listovat pomocí šipky nahoru a dolů. Dále je možné automaticky doplňovat názvy souborů a adresářů pomocí klávesy tabelator (stačí napsat část názvu souboru nebo adresáře a stisknout klávesu tabelatoru).
Chcete-li zamezit pípání terminálu, klikněte v okně terminálu na Upravit → Aktuální profil… a odškrtněte položku pípání terminálu.
Chcete-li terminál otevřít pomocí nabídky, kterou získáte poklepáním na plochu, zadejte do příkazové řádky
yum -y install nautilus-open-terminal
Terminál pak otevřete kliknutím pravého tlačítka myši a výběrem Otevřít terminál z předložené nabídky.
Obecné informace
Jména souborů a adresářů
Unixové systémy včetně Linuxu rozlišují velikost písmen v názvech souborů a adresářů. TEXT.txt
, text.txt
a text.TXT
jsou tak tři rozdílné soubory!
Při volbě jmen souborů a adresářů je také vhodné se vyvarovat českých znaků, mezer a jiných speciálních znaků. Více o problematice těchto znaků v názvech souborů a adresárů naleznete v kapitole Použití závorek a zpětného lomítka.
Proměnná PATH
Jak již bylo zmíněno v úvodu, aby bylo možné spustit daný příkaz pouze zadáním jména bez specifikování celé cesty, musí být adresář, ve kterém je příkaz uložen, definován v proměnné PATH
. Obsah této proměnné získáte pomocí příkazu
echo $PATH /usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/macky/bin
Na výše uvedeném výpisu je vidět, že proměnná PATH
obsahuje cesty k několika adresářům oddělených dvojtečkou. Jestliže uživatel zadá příkaz, jsou postupně v pořadí daném výpisem procházeny jednotlivé adresáře. V případě, že některý z těchto adresářů bude obsahovat soubor se stejným jménem jako jméno příkazu, pokusí se ho shell spustit. Jestliže se tento soubor spustit nepodaří (např. jestliže není nastaveno právo spouštění) nebo jestliže žádný z adresářů stejnojmenný soubor neobsahuje, nahlásí shell chybu.
V případě, že soubor sice existuje, avšak jeho adresář není specifikován v proměnné PATH
, jsou možná dvě řešení. Prvním a nejjednodušším řešením je uvést celou cestu k danému souboru.
/bin/ls -la
Druhou možností je pak přidat daný adresář do proměnné PATH
. Editaci této proměnné může provádět pouze superuživatel. Je také dobré si rozmyslet, zda-li je opravdu nutné daný adresář do proměnné PATH
přidávat. Jestliže totiž přidáte množství adresářů s velkým počtem souborů, může dojít z důvodu procházení těchto adresářů k prodloužení zpracování příkazů. Dalším aspektem je pak bezpečnostnost. Jestliže byste např. přidali adresář na začátek proměnné PATH
a tento adresář nezabezpečili proti zápisu pro ostatní uživatele, může dojít k „podstrčení“ příkazu. shell totiž postupně prochází všechny adresáře a spustí první soubor prvního adresáře, jehož jméno se shoduje se jménem příkazu. Příkaz ls -la
by pak namísto výpisu obsahu pracovního adresáře mohl např. mazat soubory.
Adresář /cesta/k/adresari
je možné na konec proměnné PATH
přidat pomocí příkazu
$PATH = echo $PATH:/cesta/k/adresari
Spuštení vícero příkazů
Standardně zapisujeme jeden příkaz na jeden řádek.
cd /usr/sbin ls -la
Znak středník ;
umožňuje spustit několik příkazů po sobě v pořadí uvedeném v příkazové řádce.
cd /usr/sbin; ls -la
Tento zápis je ekvivalentní s výše uvedeným.
Zástupné znaky
Zástupné znaky (tzv. wildcards) umožňují specifikovat několik jmen souborů / adresářů najednou.
Uvažujme soubory text.txt
, text.tex
a latex.tex
. Jestliže byste chtěli zjistit např. nastavená práva přiřazená těmto souborům pro jednotivé uživatele, můžete použít tři samostatné příkazy
ls -la text.txt ls -la text.tex ls -ls latex.tex
nebo jeden příkaz.
ls -la *tex*.t*
Zástupný znak hvězdička *
představuje libovolný počet znaků (včetně žádného znaku).
Dalším zástupným znakem je otazník ?
, kterým nahradíte libovolný jeden znak. Soubory text.txt
a text.tex
tedy můžete pomocí tohoto zástupneho znaku výjádřit jako
ls -la text.t??
Libovolný znak z vybrané skupiny znaků lze zapsat pomocí dvojice hranatých závorek [
, ]
, které obsahují dané znaky. Uvažujme soubory text_a.txt
, text_A.txt
1), text_b.text
, text_B.txt
, text_1.txt
a text_2.txt
. Příkaz
ls -la text_[a,b].txt
vypíše údaje o souborech text_a.txt
a text_b.txt
. Příkaz
ls -la text_[A-B].txt
zase vypíše údaje o souborech text_A.txt
a text_B.txt
. Údaje o souborech text_1.txt
a text_2.txt
získáte pomocí
ls -la text_[0-9].txt
Chcete-li získat údaje pro všechny soubory, použijte syntaxi
ls -la text_[0-9, a-z, A-Z].txt
Informace o všech souborech kromě souboru text_2.txt
získáte pomocí
ls -la text_[!2].txt
Použití závorek a zpětného lomítka
Způsob, jakým shell vyhodnocuje zadané příkazy, si v některých případech může vynutit použití závorek popř. zpětného lomítka. Klasickým příkladem jsou mezery v názvech souborů a adresářů běžně používané v OS typu Windows. Jestliže budete mít adresář jmeno adresare
bude příkaz
cd jmeno adresare
interpretován stejně jako kdybyste zadali pouze
cd jmeno
Tento problém se dá vyřešit třemi způsoby.
cd 'jmeno adresare' cd "jmeno adresare" cd jmeno\ adresare
V prvním případě jednoduché uvozovky „chrání“ v nich uzavřený text před interpretací příkazovým řádkem. Druhý příklad je totožný s prvním s tím rozdílem, že dvojité uvozovky povolují interpretaci zástupných znaků. Zpětné lomítko brání interpretaci bezprostředně následujícího znaku.
Mezi znaky interpretované shellem patří vedle mezery např. zástupné znaky, ampersand &
, znak „svislítko“ |
a lomítko /
.
Apostrof
Jestliže text uzavřete do apostrofů, bude text zpracován jako příkaz a na jeho místo bude dosazen výstup tohoto příkazu.
$pracovni_adresar=`pwd` echo $pracovni_adresar
Poznámka: Pomocí prvního příkazu definujete proměnnou pracovni_adresar
a její hodnotu vypíšete pomocí druhého příkazu. Při přiřazení hodnoty proměnné nesmí být mezi jménem proměnné, znakem rovno =
a přiřazovanou hodnotou mezera!
Přesměrování výstupu
Řada programů produkuje určitý výstup. Například příkaz
ls -la
vypíše na obrazovku obsah pracovního adresáře. Ta je v tomto případě tzv. standardním výstupem. Kdybyste však chtěli výstup tohoto příkazu zapsat do souboru, museli byste tento výstup přesměrovat. K tomu slouží znaky >
a »
.
ls -la > obsah_adresare.txt ls -la >> obsah_adresare.txt
Pomocí prvního příkazu vytvoříte soubor obsah_adresare.txt
. Pokud tento soubor již existuje, přepíšete jeho obsah. Druhý příkaz je totožný s tím rozdílem, že v případě existence souboru obsah_adresare.txt
nedojde k přepsání jeho obsahu, ale přidání výstupu na konec souboru.
V některých případech může být žádoucí výstup příkazu zahodit. V tomto případě přesměrujte výstup do adresáře /dev/null
, který je jakousi „černou dírou“ systému.
ls -la > /dev/null
Roury
Roura je mechanismus, kterým je možné přímo předat výstup jednoho příkazu příkazu jinému. Klasickým příkladem je příkaz grep
.
cat text.txt | grep Linux
Příkaz nalevo od „svislítka“ vygerenuje obsah souboru text.txt
, který je předán příkazu grep
. Ten pak vypíše všechny řádky, které obsahují slovo Linux.
Příkazy spouštěné na pozadí
Standardně jsou příkazy spouštěné na popředí. To znamená, že příkazový řádek je příkazem „zablokován“2) a uživatel musí čekat, než proběhne jeho zpracování. Alternativou k aplikacím spuštěným na popředí jsou příkazy spuštěné na pozadí. V tomto případě není příkazový řádek příkazem blokován a uživatel může spouštět další příkazy. Příkaz se spustí na pozadí tak, že se na jeho konec přidá znak ampersand &
.
sleep 60&
Narozdíl od výše uvedené syntaxe, zablokuje příkaz
sleep 60
příkazový řádek na 60 sekund. Po tuto dobu nemůže uživatel zadávat další příkazy a musí čekat, než příkaz skončí.
Uživatelé
V Linuxu rozlišujeme dvě základní kategorie úživatelů - běžného uživatele a tzv. superuživatele (root).
Účet superuživatele slouží pro správu systému. Tento uživatel tak může bez omezení přistupovat ke všem souborům, adresářům a procesů(Proces lze zjednodušeně chápat jako spuštěnou aplikaci.)). Jeho práva jsou „absolutní“ a nelze je omezit. Z tohoto důvodu je práce pod účtem superuživatele potenciálně nebezpečná - může totiž vést k poškození systému.
Naproti tomu běžní uživatelé mohou v systému vykonávat pouze takové činnosti, které jim dovolují přidělená práva. Standardně tato práva spravuje právě superuživatel.
Každý z uživatelů patří minimálně do jedné skupiny uživatelů, přičemž jedna z těchto skupin je defaultní. Skupiny uživatelů jsou důležité pro definování přístupových práv. Tímto způsobem je umožněn definované skupině uživatelů přístup ke společným souborům / adresářům popř. spouštění programů.
useradd
Příkaz useradd
přidá do systému nového uživatele. Následující příkaz vytvoří uživatele uzivatel
náležícího do defaultní skupiny skupina
. Pro tohoto uživatele vytvoří domovský adresář /home/uzivatel
(v případě, že tento adresář neexistuje).
/usr/sbin/useradd -m uzivatel -g skupina
Poznámka: Pro tohoto uživatele je ještě zapotřebí nastavit heslo pomocí příkazu passwd
.
userdel
userdel
slouží k odstranění uživatele. Pomocí příkazu
/usr/sbin/userdel -r uzivatel
odstraníte ze systému uživatele uzivatel
včetně jeho domovského adresáře.
groupadd
Příkaz groupadd
přidává do systému novou skupinu.
/usr/sbin/groupadd -f skupina
groupdel
groupdel
slouží k odebrání skupiny. Aby bylo možné skupinu odebrat, je nejprve nutné zrušit účet všem uživatelům, kteří do této skupiny patří. Předpokládejme, že budeme chtít zrušit skupinu skupina
. Seznam uživatelů náležících do této skupiny lze získat následujícím způsobem. Nejprve je třeba ze souboru etc/group
zjistit identifikační číslo skupiny skupina
.
cat /etc/group | grep skupina skupina:x:501:
Seznam uživatelů této skupiny získáme pomocí
cat /etc/passwd | grep 501 uzivatel:x:501:501::/home/uzivatel:/bin/bash
Nejprve je třeba odstranit uživatele, po té je možné odstranit skupinu.
/usr/sbin/userdel -r uzivatel /usr/sbin/groupdel skupina
passwd
Příkaz passwd
umožňuje uživateli provést změnu svého hesla. Jinému uživateli může heslo změnit pouze superuživatel.
Své heslo můžete změnit pomocí
passwd
Superuživatel pak může změnit heslo jiného uživatele pomocí
passwd jmeno_uzivatele
su
su
je příkazem pro změnu uživatele. Klasickým případem je, když z důvodu instalace aplikace potřebujete dočasně získat práva superuživatele. Po zadání příkazu su
budete vyzváni k zadání hesla daného uživatele (s vyjímkou případů, kdy tento příkaz spouštíte jako superuživatel).
Změnu uživatele na superuživatele provedete pomocí
su
popř.
su root
Jestliže chcete změnit svou „identitu“ na jiného uživatele, použijte následující syntaxi
su jmeno_uzivatele
su
můžete také spustit ve tvaru
su - jmeno_uzivatele
Rozdíl oproti výše uvedené syntaxi je v tom, že se Vám nastaví kompletní shell prostředí daného uživatele (tj. včetně případných proměnných a dalších vlastností).
Základní informace o systému
uname
uname
slouží ke zjištění údajů o systému, ke kterému jste momentálně přihlášeni.
uname -a Linux localhost.localdomain 2.6.17-1.2139_FC5 #1 Fri Jun 23 12:40:16 EDT 2006 i686 athlon i386 GNU/Linux
whoami
whoami
vypíše jméno uživatele, který momentálně „ovládá“ příkazový řádek.
whoami macky
hostname
hostname
slouží k zobrazení jméno počítače, ke kterému jste přihlášeni.
hostname localhost.localdomain
free
free
vypíše informace o využití fyzické operační paměti a tzv. swapu. Údaje zde uváděné jsou v násobcích 1kB.
free total used free shared buffers cached Mem: 515696 507504 8192 0 11444 189824 -/+ buffers/cache: 306236 209460 Swap: 0 0 0
w
w
zobrazí základní informace o uživatelích přihlášených do systému a o aplikacích, které tito uživatelé spustili. Dále lze pomocí tohoto příkazu získat informace o čase a zatížení CPU za poslední 1, 5 a 15 minut.
w 18:15:43 up 1:11, 3 users, load average: 0.40, 0.76, 0.59 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT macky :0 - 17:04 ?xdm? 4:35 0.66s gnome-session macky pts/1 :0.0 17:18 1:20 0.02s 0.02s bash macky pts/2 :0.0 18:12 0.00s 0.06s 0.01s w
df
df
slouží k získávání informací o místě připojení jednotlivých diskových oddílů a míře zaplnění jejich diskového prostoru.
df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda6 9912560 5660824 3740068 61% / tmpfs 257848 0 257848 0% /dev/shm /dev/sda7 1984016 614028 1267576 33% /home /dev/sda8 28080704 4358864 22272380 17% /opt /dev/sda1 5116668 3151676 1964992 62% /media/windows_c
Informace zde uváděné jsou v tzv. blocích, které mají standardně velikost 1kB. Pokud Vám tento formát přijde nepřehledný, zkuste použít syntaxi
df -h Filesystem Size Used Avail Use% Mounted on /dev/sda6 9.5G 5.4G 3.6G 61% / tmpfs 252M 0 252M 0% /dev/shm /dev/sda7 1.9G 600M 1.3G 33% /home /dev/sda8 27G 4.2G 22G 17% /opt /dev/sda1 4.9G 3.1G 1.9G 62% /media/windows_c
která vypíše volné místo v kB/MB/GB.
Poznámka: Pro získání informací o značení disků v Linuxu si přečtěte kapitolu Disky a mechaniky CD/DVD.
Práce se soubory
Každý soubor a adresář3) má svého vlastníka. Standardně je vlastníkem souboru uživatel, který ho vytvořil. Soubory pak lze vytvářet pouze v adresářích, kde k tomu má uživatel oprávnění. Toto pravidlo neplatí pouze pro tzv. superuživatele4) - ten může přistupovat ke všem souborům a adresářům bez omezení. Více o přístupových právech viz. kapitola Definování přístupových práv.
cd
cd
slouží ke změně pracovního adresáře. Pracovním adresářem se rozumí adresář, ve kterém se uživatel momentálně nachází a k jehož souborům hodlá primárně přistupovat.
Následujícím příkazem nastavíte adresář /opt/games
jako pracovní.
cd /opt/games
Příkaz
cd sauerbraten
Vás přesune do podadresáře sauerbraten
, který se nachází v aktuální pracovním adresáři.
V prvním zápise je použita tzv. absolutní cesta k adresáři, v druhém pak cesta relativní. Absolutní cesta vždy začíná lomítkem /
, což je adresář na samém vrchodu adresářového stromu - tzv. kořenový adresář. Naproti tomu relativní cesta lomítkem nezačíná - zadaný adresář je hledán pouze v pracovním adresáři. Absolutní cesta adresáře sauerbraten
je tedy /opt/games/sauerbraten
.
pwd
pwd
slouží k zjištění aktuálního pracovního adresáře.
pwd /opt/games/sauerbraten
ls
Pomocí ls
lze získat obsah adresáře. Maximální dostupnou informaci získáme pomocí přepínačů -la
.
ls -la /opt drwxr-xr-x 8 root root 4096 Aug 13 18:35 . drwxr-xr-x 24 root root 4096 Aug 27 17:04 .. drwx------ 2 root root 16384 Jun 24 13:50 lost+found drwxrwxrwx 5 root root 4096 Aug 17 20:38 macky
První blok znaků označuje typ souboru5) a tzv. přístupová práva. Druhý údaj je počtem odkazů na daný soubor. Třetí a čtvrtý blok představují jméno vlastníka souboru a jeho defaultní skupinu. Pátý blok udává velikost souboru v bytech. Následuje datum a čas vytvoření souboru. Posledním údajem je pak název samotného souboru6).
du
du
vypíše množství diskového prostoru alokovaného pro zvolený soubor či adresář.
Příkaz
du /home/macky ... 4128 /home/macky/Desktop ... 51900 /home/macky/.mozilla ...
vypíše seznam souborů a adresářů obsažených v adresáři /home/macky
spolu s údajem o velikosti v jednotkách 1kB diskového prostoru, který zabírají. Příkaz je také možné použít s přepínačem -h
, který velikost souborů a adresářů vyjádří v jednotkách kB/MB/GB.
du -h /home/macky ... 4.1M /home/macky/Desktop ... 51M /home/macky/.mozilla ...
Příkaz
du -s /home/macky
naproti tomu vypíše pouze jedno číslo odpovídající velikosti diskového prostoru, který zabírá adresář /home/macky
včetně podadresářů a souborů. Opět je možné použít přepínač -h
.
du -sh /home/macky 566M /home/macky
file
file
slouží k zjištění typu (datového formátu) souboru.
file /opt/text.txt text.txt: ASCII text
rm
Příkaz rm
se používá pro odstranění souborů, souborových linků a celé adresářové struktury.
rm -ri /opt/games
Při specifikaci souborů je možné použít zástupné znaky.
rm -ri /opt/games/*.txt rm -ri /opt/games/[A,B,C]*?
rmdir
rmdir
je příkaz, kterým se mažou adresáře.
rmdir /opt/games
Stejně jako rm
podporuje rmdir
zástupné znaky.
touch
Příkaz touch
slouží k vytvoření souboru.
touch text.txt
Poznámka: Soubor je možné vytvořit i pomocí textového editoru nebo přesměrováním výstupu jiného souboru. Klasickým případem je uložení výstupu manuálových stránek do souboru.
man rmdir > manualove_stranky_mrdir.txt
mkdir
mkdir
slouží k vytvoření nových adresářů.
mkdir /opt/games
cp
cp
slouží ke kopírování souborů.
cp zdrojove_soubory cilovy_soubor_nebo_adresar
Pomocí výše uvedené syntaxe překopírujeme všechny soubory do cílového adresáře. Příkaz cp
podporuje také zástupné znaky.
mv
mv
slouží k přesunu popř. přejmenování souborů / adresářů7). Příkaz mv
podporuje zástupné znaky.
mv -f zdrojovy_soubor cilovy_soubor mv -f zdrojovy_adresar cilovy_adresar mv -f seznam_zdrojovych_souboru cilovy_adresar
Poznámka: Přepínač -f
přepíše případně existující soubory.
find
Pomocí find
je možné nalézt umístění zvoleného souboru či adresáře. Tento příkaz podporuje zástupné znaky.
find adresar_k_prohledani -name "jmeno_hledaneho_souboru_nebo_adresare"
Následující příkaz vyhledá všechny textové soubory začínající velkým písmenem v celém systému8).
find / -name "[A-Z]*.txt"
Jestliže chcete omezit vyhledávání na soubory, které někdo modifikoval před pocet_dnu
dny, použijte přepínač -atime
.
find / -atime pocet_dnu -name "*.txt"
Jestliže chcete omezit vyhledávání na soubory, ke kterým někdo přistupoval před pocet_dnu
dny, použijte přepínač -mtime
.
find / -mtime pocet_dnu -name "*.txt"
locate
Příkaz locate
umožňuje podobně jako find
lokální vyhledávání souborů. Narozdíl od find
však locate
vyhledává soubory na základě vlastní databáze. Výhodou tohoto přístupu je vyšší rychlost vyhledávání. Na druhou stranu je však třeba pravidelně aktualizovat databázi. Jestliže byste totiž chtěli vyhledat soubor / adresář, který byl vytvořen po aktualizaci této databáze, skončilo by vyhledávání neúspěchem.
locate [A-Z]*.txt
Databázi je pak možné aktualizovat z účtu superuživatele pomocí příkazu
updatedb
ln
ln
vytváří tzv. linky na soubory. Rozlišujeme dva typy linků - pevné a symbolické. Unixové systémy původně používaly pevné linky, ke kterým později přibyly jako alternativa symbolické linky. Důvodem byla četná omezení pevných linků (viz. níže).
Symbolický link je položka v adresáři, která obsahuje cestu k souboru popř. adresáři, na který se odkazuje. Pokud tedy např. provádíte „editaci“ symbolického linku, který se odkazuje na soubor, provádíte v skutečnosti editaci tohoto souboru. Pomocí symbolických linků je možné odkazovat i na soubory a adresáře, které se nacházejí na jiném systému souborů9). Narozdíl od pevného linku může symbolický link odkazovat i na neexistující soubor či adresář.
Pevný link je odkazem přímým - není tvořen samostatným souborem ale pouze odkazem v adresáři. Pevný link může odkazovat pouze na soubor a děje se tak nikoliv pomocí cesty ale prostřednictvím tzv. inode10).
Nastavením práv uživatele k linku nedochází automaticky k nastavení práv k příslušnému souboru. Práva je třeba nastavit zvlášť.
Symbolický link vytvoříte pomocí
ln -s zdrojovy_soubor nazev_linku
pevný link pak pomocí
ln zdrojovy_soubor nazev_linku
Výhoda linků je zřejmá - umožnují elegantně obcházet potřebu kopírování souborů, jestliže je potřebujete na „dvou“ místech. To přispívá k úspoře místa na disku a konzistentnosti systému.
Poznámka: Pro vytváření symbolických linků je zapotřebí použít absolutní cestu.
mc
mc
je zkratka pro Midnight Commander. Nejedná se ani tak o klasický příkaz jako spíše o aplikaci - klon známého Northon Commander z dob nadvlády MS-DOSu. Tato aplikace umožňuje vytváření, přesun, přejmenování a mazání souborů a adresářů. mc
má také vestavěný editor pro modifikaci souborů a obsahuje jednoduchého FTP klienta.
mc
Poznámka: Jestliže mc
není nainstalován, lze ho snadno přidat jako superuživatel pomocí
yum -y install mc
Výpis obsahu souborů
cat
cat
slouží k výpisu obsahu souboru.
cat text.txt
Výpis obsahu souboru je možné přesměrovat do nového souboru.
cat text.txt > novy_textovy_soubor.txt
more
more
slouží podobně jako cat
k výpisu obsahu souborů. Narozdíl od cat
však more
obsah souboru „rozobrazovkuje“. To znamená, že obsah souboru nevypíše najednou, ale rozdělí jej. Na obrazovku vypíše vždy část textu a výpis pokračuje až po stisku klávesy. Tento příkaz se používá zejména při prohlížení dlouhých textových souborů.
more text.txt
less
Ačkoliv je název možná trochu matoucí, umí toho příkaz less
více než příkaz more
. Příkaz less
stejně jako more
provede „rozobrazovkování“ výpisu obsahu souboru, avšak tento výpis je možné volně procházet pomocí kláves Page Up a Page Down.
less text.txt
Práce s textem
grep
grep
slouží k vyhledávání textových řetězců v souborech. Velice často se pojí s příkazy pro výpis textu.
Následující příkaz vypíše všechny řádky souboru text.txt
, které obsahují sekvenci znaků inux.
cat text.txt | grep inux
Jestliže použijete přepínač -v
, budou vypsány naopak všechny řádky, které daný řetezec neobsahují.
cat text.txt | grep -v inux
Počet řádek, které obsahují hledaný řetězec, získáte pomocí přepínače -c
.
cat text.txt | grep -c inux
Pro jmenný seznam souborů, které obsahují alespoň jednou hledaný řetězec, použijte přepínač -l
.
grep -l *.txt
Pomocí přepínače -i
docílíte, že vyhledávání není citlivé na malá a velká písmena.
cat text.text | grep -i inux
head
head
vypíše prvních pocet_radku
řádků daného souboru.
head -pocet_radku text.txt
tail
tail
je analogií příkazu head
- vypíše posledních pocet_radku
řádků daného souboru.
tail -pocet_radku text.txt
cut
cut
slouží k výpisu specifikovaných částí (tzv. polí) zvoleného souboru. Pole mohou být definována pozicí znaků v souboru nebo pomocí tzv. oddělovačů.
Uvažujme následující soubor text.txt
.
Josef;Novak;Praha;607924002 Jan;Benes;Brno;777523000 Petr;Dvorak;Ostrava;603111222
Pomocí příkazu
cut -c5 text.txt
získáme z každé řádky 5. znak. Příkazem
cut -c1,3,5 text.txt
pak vyberete z každé řádky 1., 3. a 5. znak. Sekvenci 1. až 5. znaku z každého řádku lze získat pomocí
cut -c1-5 text.txt
Budeme-li chtít pole definovat pomocí oddělovače ;
, je třeba použít přepínače -d
(specifikuje oddělovač) a -f
(specifikuje pole). Příjmení osob ze souboru text.txt
tak získáte pomocí příkazu
cut -d';' -f2 text.txt
Poznámka: Vzhledem k tomu, že oddělovač ;
má v Linuxu speciální význam, musí být uzavřen do uvozovek (více viz. kapitola Použití závorek a zpětného lomítka).
Jestliže v daném souboru chcete zpracovat pouze řádky, které obsahují oddělovač, použijte přepínač -s
. Řádky, které neobsahují znak oddělovače budou ignorovány.
cut -s -d';' -f2 text.txt
join
Příkaz join
porovná dva setříděné soubory a vypíše společné řádky. Každá ze společných řádek se na výstupu objeví pouze jednou (duplicitní řádky jsou na výstupu odstraněny).
Uvažujme soubor text1.txt
Josef;Novak;Praha;607924002 Jan;Benes;Brno;777523000 Petr;Dvorak;Ostrava;603111222
a soubor text2.txt
Petr;Dvorak;Ostrava;603111222 Pavel;Strnad;Plzen;604268954
Výsledkem příkazu
join text1.txt text2.txt > text.txt
bude soubor text.txt
.
Petr;Dvorak;Ostrava;603111222
tr
tr
umožňuje nahrazovat popř. mazat vybrané znaky.
Uvažujme soubor text1.txt
.
Josef;Novak;Praha;607924002 Jan;Benes;Brno;777523000 Petr;Dvorak;Ostrava;603111222
Příkaz
tr JNPBDO jnpbdo < text1.txt > text2.txt
vytvoří soubor text2.txt
, ve kterém budou velká písmena nahrazena písmeny malými.
josef;novak;praha;607924002 jan;benes;brno;777523000 petr;dvorak;ostrava;603111222
Systematičtější řešení tohoto problému přestavuje příkaz
tr [A-Z] [a-z] < text1.txt > text2.txt
Jestliže chcete namísto záměny znaků provést jejich výmaz, stačí použít přepínač -d
.
tr -d ';' < text1.txt > text2.txt
Poznámka: Vzhledem k tomu, že oddělovač ;
má v Linuxu speciální význam, musí být uzavřen do uvozovek (více viz. kapitola Použití závorek a zpětného lomítka).
wc
Příkaz wc
slouží k určení počtu znaků (přepínač -c
), slov (přepínač -w
) či řádek (přepínač -l
) v souboru.
wc -c text.txt 25
comm
comm
porovnává dva setříděné soubory. Výstupem příkazu jsou tři sloupce - první sloupec obsahuje řádky obsažené pouze v prvním souboru, druhý sloupec řádky obsažené pouze v druhém souboru a třetí sloupec obsahuje společné řádky.
comm text1.txt text2.txt
Jestliže chcete potlačit výstup některého ze sloupců, použijte jako přepínač jeho pořadové číslo.
comm -1 -2 text1.txt text2.txt
sort
sort
umožňuje třídit a slučovat soubory. Syntaxe příkazu je následující
sort pripadne_prepinace nazev_souboru
kde nazev_souboru
představuje název souboru popř. souborů oddělených mezerou.
Níže uvedená tabulka uvádí seznam nejdůležitějších přepínačů příkazů sort
.
Přepínač | Popis |
---|---|
bez přepínače | setřídí soubory |
-c | zkontroluje, zda-li je soubor setříděn |
-m | spojuje soubory za předpokladu, že jsou již setříděné |
-u | odstraní případné duplicitní řádky (jedinečnost řádek je dána jedinečností třídícího klíče) |
-d | setřídí soubor podle abecedního pořádku (používá pouze písmena, číslice a mezery) |
-f | ignoruje rozdíl mezi velkými a malými písmeny |
-r | třídí sestupně (implicitně je nastaveno vzestupné třídění) |
-toddelovac | specifikuje znak oddělovače |
+zacatek | určuje, že třídící klíč začíná polem číslo zacatek (první pole má pořadové číslo 0) |
-konec | určuje, že třídící klíč končí polem číslo konec (první pole má pořadové číslo 0) |
sort -dfr text.txt sort -t';' +0 -2 text.txt sort -m text1.txt text2.txt
uniq
uniq
porovnává sousední řádky souboru. Tento příkaz slouží k odstraňování duplicitních řádků na výstupu a výpisu duplicitních popř. jedinečných řádků. Příkaz uniq
předpokládá, že je daný soubor setříděn.
Příkaz
sort text.txt | uniq
vypíše obsah souboru text.txt
, přičemž na výstupu odstraní duplicitní řádky.
Příkaz
sort text.txt | uniq -u
výpíše jedinečné řádky souboru text.txt
.
Příkaz
sort text.txt | uniq -d
naopak vypíše duplicitní řádky (každý duplicitní řádek pouze jednou), které jsou obsaženy v souboru text.txt
.
Pomocí přepínače -c
lze zjistit, kolikrát je daný řádek obsažen ve vstupním souboru.
sort text.txt | uniq -c
Definování přístupových práv
Jak již bylo zmíměno v kapitole Práce se soubory, každý soubor a adresář má svého vlastníka. Ten pak určuje, jaké operace mohou s těmito soubory / adresáři provádět ostatní uživatelé. Standardně se jedná v případě souborů o právo čtění (read), zápisu (write) a spouštění (execute); v případě adresáře pak o právo prohlížení obsahu (ekvivalent práva čtení), manipulace se soubory (ekvivalent práva zápisu) a právo zobrazovat informace o souborech (ekvivalent práva spouštění)11). Při přidělování práv pak rozlišujeme následující tři skupiny uživatelů: (1) vlastníka souboru / adresáře, (2) tzv. skupinu uživatele a (3) ostatní uživatele. Práva může jednotlivým skupinám přidělit vlastník12). Přehled práv, která se váží k vybranému souboru / adresáři lze získat pomocí příkazu ls
.
Předpokládejme, že příkaz
ls -la /home/macky/text.txt
zobrazil výpis
´-rwxr-xr-x 1 macky skupina 23056 čec 26 23:10 Derivates.tex
První znak -
(pomlčka) značí, že se jedná o soubor13). Následující trojice znaků značí práva vlastníka souboru - jedná se o právo čtení (read), zápisu (write) a spouštění (execute). Další trojice definuje práva skupiny a to jmenovitě právo čtení a spouštění. Ostatním uživatelům byla opět přidělena práva čtení a spouštění. Dále nám výpis říká, že vlastníkem souboru je uživatel macky
, který náleží do skupiny skupina
.
chgrp
Příkaz chgrp
slouží ke změně vlastníků specifikovaných souborů / adresářů. Změnu skupiny může provést pouze vlastník popř. superuživatel. Tento příkaz podporuje zástupné znaky.
chgrp nova_skupina jmeno_souboru_nebo_adresar
chown
Příkaz chown
je podobný výše uvedenému příkazu chgrp
s tím rozdílem, že slouží ke změně vlastníka souboru / adresáře.
chown novy_vlastnik jmeno_souboru_nebo_adresare
chmod
Pomocí příkazu chmod
lze měnit měnit práva přiřazená jednotlivým uživatelům popř. skupinám uživatelů. Je možné použít dva způsoby zápisu.
V prvním případě nejprve specifikujete skupinu uživatelů, kterou následuje znak plus (+) popř. mínus (-) doprovázený výčtem práv, která mají být přidána popř. odebrána. Co se skupin uživatelů týče, používají se písmena u (user) pro označení vlastníka, g (group) pro označení skupiny a o (other) pro označení ostatních uživatelů. Práva pak označujeme písmeny r (read) pro čtení, w (write) pro zápis a x (execute) pro spuštění.
Následující příkaz přidá vlastníkovi a jeho skupině práva čtení a zápisu pro soubor soubor
, který se nachází v pracovním adresáři.
chmod ug+rw soubor
Druhá varianta zápisu využívá čísel.
čtení | zápis | spouštění | |
---|---|---|---|
vlastník | 400 | 200 | 100 |
skupina | 40 | 20 | 10 |
ostatní | 4 | 2 | 1 |
Výsledná práva jsou dána součtem čísel uvedených v tabulce. Například příkaz
chmod 750 soubor
nastaví vlastníkovi všechna práva, skupině vlastníka právo čtení a spouštění. Ostatním uživatelům nebyla přidělena žádná práva. Výsledné číslo 750 je tedy součtem čísel 400, 200, 100, 40 a 10.
umask
Pomocí příkazu umask
se nastavují implicitní práva pro nově vytvořené soubory. Syntaxe tohoto příkazu je podobná jako v případě chmod
s číselnou notací. Zásadní rozdíl je v tom, že čísla neurčují práva, která se mají přidat ale naopak práva, která mají odebrána. Například
umask 027
ponechává vlastníkovi všechna práva, skupině vlastníka pak práva čtení a spouštění a ostatním uživatelům jsou odebrána všechna práva.
Standardně jsou tato implicitní práva specifikována v souboru /etc/bashrc
, nicméně každý uživatel si toto nastavení může změnit zápisem do souboru .bashrc
, který se nachází v jeho domovském adresáři14).
Řízení procesů
Procesem budeme pro účely této kapitoly rozumnět jakýkoliv spuštěný program. Každému procesu jsou pak jádrem přiřazovány systémové zdroje (tj. procesor a paměť).
ps
Pomocí příkazu ps aux
získáte seznam všech spuštěných procesů
ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 1992 676 ? Ss 20:24 0:00 init [5] root 2 0.0 0.0 0 0 ? SN 20:24 0:00 [ksoftirqd/0] root 3 0.0 0.0 0 0 ? S 20:24 0:00 [watchdog/0] root 4 0.0 0.0 0 0 ? S< 20:24 0:00 [events/0] root 5 0.0 0.0 0 0 ? S< 20:24 0:00 [khelper] root 6 0.0 0.0 0 0 ? S< 20:24 0:00 [kthread] root 2045 0.0 0.8 11480 4636 ? S 20:24 0:00 python ./hpssd.py root 2057 0.0 0.5 9272 2908 ? Ss 20:24 0:00 cupsd postgres 2143 0.0 0.6 20232 3108 ? S 20:25 0:00 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data postgres 2145 0.0 0.1 10020 560 ? S 20:25 0:00 postgres: logger process postgres 2147 0.0 0.1 20232 852 ? S 20:25 0:00 postgres: writer process postgres 2148 0.0 0.1 11020 548 ? S 20:25 0:00 postgres: stats buffer process postgres 2149 0.0 0.1 10252 728 ? S 20:25 0:00 postgres: stats collector process macky 2956 0.0 2.1 52884 11104 ? Sl 20:36 0:00 xmms -e macky 3202 0.4 2.7 88864 14324 ? S 21:16 0:00 gaim ...
Z výše uvedeného výpisu lze pro každý proces zjistit uživatele, který jej spustil (položka USER) a identifikační číslo procesu (položka PID). Vzhledem k tomu, že tento výpis může být vcelku dlouhý, je vhodné použít také příkaz less
popř. grep
. Například seznam všech procesů spuštěných uživatelem macky získáte pomocí příkazu
ps aux | grep macky
top
Dalším z příkazů, který souvisí s procesy, je top
. Tento příkaz je velmi podobný příkazu ps
. Výstupem příkazu top
je seznam procesů, které zabírají nejvíce systémových prostředků (řazení procesů je dáno zatížením procesoru). Tento seznam se neustále aktualizuje - v případě, že jej chcete ukončit, stikněte klávesu q.
top
kill
Příkaz kill
slouží k ukončení procesů15). Jeho syntaxe je následující
kill pid_procesu
PID daného procesu lze získat pomocí příkazu
ps aux
Každý uživatel může „zabít“ svoje procesy; superuživatel pak může zabít jakýkoliv proces16).
Poznámka: Příkaz spuštěný z příkazové řádky lze ukončit pomocí klávesové zkratky Ctrl + Z.
nice a renice
Systémové prostředky (např. procesorový čas a paměť) jsou „vzácné“, a proto jsou jádrem OS přiřazovány jednotlivým procesům. Každý proces má tak tyto prostředky k dispozici po určité kvantum času. Po uplynutí tohoto časového kvanta jsou systémové prostředky uvolněny ve prospěch jiného procesu.
Pomocí příkazů nice
a renice
je možné procesům nastavovat přístup k procesorovému času. To, jakou měrou využívá proces procesorový čas, vyjadřuje „nice value“ (tzv. „ohleduplnost“). Pomocí „nice value“ tedy určujeme prioritu procesu. Tato veličina může nabývat hodnot od -20 (vysoká priorita procesu) do 19 (nízká priorita procesu).
Běžný uživatel může „ohleduplnost“ svých procesů pouze zvýšit; superuživatel může nastavit „nice value“ na libovolnou hodnotu.
Pomocí příkazu nice
je možné nastavit hodnotu „ohleduplnosti“ nově spouštěného příkazu. Příkaz nice
zvýší popř. sníží „nice value“ o hodnotu inkrementu, který následuje za přepínačem -n
. Výsledná priorita procesu je dána součtem tohoto inkrementu a priority shellu, ze kterého byl příkaz spuštěn. Následující syntaxí snížíte prioritu (tj. zvýšíte „ohleduplnost“) procesu o 5.
nice -n 5 /bin/nejaky_prikaz
Prioritu již spuštěného přikazu lze změnit pomocí renice
. Zatímco příkaz nice
změnil prioritu procesu o inkrement, příkaz renice
nastavuje prioritu přímo na hodnotu, která ho následuje. Následující příkaz nastaví prioritu procesu s PID pid_procesu
na hodnotu 10.
renice 10 pid_procesu
Hodnotu PID daného procesu lze získat např. pomocí ps aux
.
Poznámka: Přikazy nice
a renice
byly představeny v 70.letech. Při dnešním výkonu procesorů však tyto příkazy ztrácí význam. Úzkým hrdlem systému jsou pevné disky - jejich využití z pohledu procesů však pomocí přikazů nice
a renice
nenastavíte.
Matematika z příkazové řádky
Proměnné
Proměnné v unixových systémech nemají přiřazen typ proměnné - všechny proměnné považuje shell za proměnné typu text.
Proměnná se vytvoří specifikací jejího jména a přiřazením hodnoty a není ji tak potřeba před použitím deklarovat. Jméno proměnné musí vždy začínat písmenem.
K hodnotám uloženým v proměnné se přistupuje pomocí znaku dolar $
, který je následován jménem proměnné.
echo
není „matematickým“ příkazem - slouží k výpisu textu popř. hodnoty proměnné. Právě díky jeho schopnosti vypsat hodnotu proměnné je však často využíván ve spojení s níže uvedenými příkazy.
x=5 echo $x
Poznámka: Mezi jménem proměnným, znakem =
a hodnotou proměnné nesmí být mezera ani tabelátor.
Po definování existuje proměnná v shellu až do jeho ukončení. V případě, že chcete proměnnou odstranit před ukončením shellu, použijte příkaz unset
.
unset x
Kromě hodnot proměnných je možné příkaz echo
použít k výpisu textu.
echo "Hello World!" x=10 echo "Hodnota promenne x je: " $x
Hodnotu proměnné je možné zadávat také interaktivně. K tomuto účelu slouží příkaz read
, který lze použít k zadání hodnoty proměnné přímo z příkazové řádky.
read x 10 echo $x 10
Jestliže chcete přiřadit hodnotu proměnné na základě výstupu příkazu použijte syntaxi
x=`prikaz`
Globální proměnné
Proměnné definované podle výše uvedeného textu budou definovány pouze v aktuálním shellu. Jestliže tedy otevřete nové okno s příkazovou řádkou, tuto proměnnou v něm „neuvidíte“. Hovoříme o tzv. lokální proměnné. Globální proměnnou, tj. proměnnou „viditelnou“ také z jiného než aktuálního shellu, se stane až použitím příkazu export
.
export $promenna
Tip: Jestliže potřebujete, aby proměnné byly globálně definované již po startu systému, je vhodné je umístit do souboru /etc/bash.bashrc
.
$promenna = hodnota export $promenna
expr
Hodnotu jednoduchých výrazů lze vypočítat pomocí příkazu expr
. Tento příkaz umí pracovat se základními matematickými ( +
, -
, *
, /
, %
), logickými ( &
- AND, |
OR) a porovnávacími (=
, <
, >
, ⇐
, ⇒
, !=
) operátory. Příkaz expr
zvládá početní operace pouze s celými čísly.
echo `expr 1 '<' 2` 1 echo `expr 1 '>' 2` 0 echo `expr 5 '%' 2` 1 echo `expr 1 '&' 0` 0 x = `expr 1 '+' 6` echo $x 7
Poznámka: Řada operátorů má v Linuxu speciální význam. Proto je třeba tyto operátory pomocí apostrofů „ochránit“ před interpretací shellem (více viz. kapitola Použití závorek a zpětného lomítka).
Vzhledem k tomu, že proměnnými je v unixových systémech nakládáno jako s řetězcem, je třeba použít příkaz expr
, jestliže chcete, aby bylo s jejich hodnotami nakládáno jako s čísly.
x=1 y=$x+1 echo $y 1+1
x=1 y=`expr $x+1` echo $y 2
Příkaz expr
je také možné použít pro práci s textovými řetězci. Např. délku řetězce lze určit pomocí
echo `expr length "Fedora Core"` 11
Následující příkaz vybere specifikovaný podřetězec.
echo `expr substr "Fedora Core" 8 4` Core
Pomocí níže uvedeného příkazu je možné otestovat, zda-li řetězec obsahuje hledaný podřetězec. Příkaz standardně vrací číslo první pozice znaku řetezce, který se shoduje s některým ze znaků podřetězce. V případě, že se řetězec a podřetězec neshodují ani v jednom znaku, vrátí příkaz hodnotu nula.
echo `expr index "Fedora Core" "Core"` 2 echo `expr index "Fedora Core" "Linux"` 0
bc
bc
je jazyk pro matematické výpočty. Komunikace s bc
probíhá interaktivně. Podporu desetinných čísel zapnete pomocí přepínače -l
. Práci s bc
ukončíte pomocí příkazu quit
.
bc -l bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty`. 1/3 .333333333333333333333 1 < 0 0 5*(1/3+1) 6.66666666666666666666 quit
Tisk z příkazové řádky
Pro tisk z příkazové řádky se používají příkazy lp
(System V) a lpr
(BSD). V Linuxu jsou z důvodu kompatibility obsaženy oba příkazy. Jedná se však o stejnou funkcionalitu tiskového systému CUPS, která se liší pouze syntaxí. Následují text se zaměřuje na lpr
a s ním související příkazy.
Z příkazové řádky je možné přímo tisknout textové a postscriptové soubory17). Jestliže chcete v příkazové řádce např. vytisknout textový soubor, stačí zadat
lpr text.txt
Tento příkaz zařadí tiskovou úlohu do fronty výchozí tiskárny. Jestliže máte tiskáren více, je možné požadovanou tiskárnu specifikovat pomocí přepínače -P
bezprostředně následovaného jménem tiskárny.
lpr -Pjmeno_tiskarny text.txt
Seznam dostupných tiskáren získáte pomocí příkazu
cat /etc/printcap tiskarna|HP Inkjet:rm=localhost.localdomain:rp=tiskarna
Dle výše uvedeného výpisu je k dispozici pouze jedna tiskárna, která se jmenuje tiskarna
.
Seznam úloh, které se momentálně nachází v tiskové frontě získáte pomocí příkazu lpq
.
lpq Rank Owner Job File(s) Total Size 1st macky 3 (standard input) 7768 bytes
lpq -Pjmeno_tiskarny Rank Owner Job File(s) Total Size 1st macky 3 (standard input) 7768 bytes
Konkrétní úlohu je možné z tiskové fronty odstranit příkazem lprm
.
lprm cislo_tiskove_ulohy
lprm -Pjmeno_tiskarny cislo_tiskove_ulohy
Parametr cislo_tiskove_ulohy
je číslo uvedené ve sloupci Job
na výpisu příkazu lpq
(viz. výše).
Tiskové úlohy konkrétního uživatele odstraníte pomocí
lprm jmeno_uzivatele
popř.
lprm -Pjmeno_tiskarny jmeno_uzivatele
Všechny tiskové úlohy lze odstranit příkazem
lprm -
popř.
lprm - -Pjmeno_tiskarny
Poznámka: Tiskové úlohy jiného uživatele může odstranit pouze superuživatel.
Tip: Manuálové stránky lze tisknout příkazem
man klicove_slovo | col -b | lpr -Pjmeno_tiskarny
Vypnutí / restart počítače
Počítač lze z účtu superuživatele vypnout pomocí příkazu
/sbin/shutdown -h now
a restartovat pomocí
/sbin/shutdown -r now
Jako běžný uživatel můžete pro restart použít příkaz
reboot
a pro vypnutí systému příkaz
poweroff
Poznámka: Příkazy reboot
a poweroff
nelze narozdíl od příkazu shutdown
použít pro vzdálený restart / vypnutí počítače.
Aliasy
Alias umožňuje definovat souslednost příkazů a těm následně přiřadit jméno. Aliasy jsou svojí logikou velice blízké níže popisovaným funkcím. Základním rozdílem však je rychlost. Funkce je spouštěna přímo v aktuálním shellu, a proto je rychlejší než alias, který je spouštěn v „podshellu“. V praxi je však tento rozdíl nepodstatný.
Seznam všech aliasů definovaných ve Vašem systému zíkáte příkazem
alias alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias mc='. /usr/share/mc/bin/mc-wrapper.sh' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-ti'
Definovat nový alias lze snadno pomocí následující syntaxe
alias turnoff='echo "Turning off the computer..."; /sbin/shutdown -h now'
Pokud výše uvedený alias spustíte z účtu superuživatele, dojde k vypnutí počítače.
turnoff
Programování
Shell je možné použít jako programovací jazyk. Není sice tak všestranný jako např. Java nebo C++, ale přesto je možné s jeho využitím řešit řadu problémů. Následující kapitola předpokládá znalost základních příkazů a představuje tak zakončení této kapitoly.
Skript
V souvislosti s shellem a programováním se často mluví o tzv. skriptu. Skript není nic jiného než textový soubor, který má pro vybrané skupiny uživatelů nastaveno právo spouštění. Tento soubor obsahuje posloupnost příkazů prováděných shellem - ten soubor “čte” a provádí postupně jednotlivé příkazy. V rámci jednoho skriptu je možné se odvolávat na jiné skripty, což umožňuje konstrukci poměrně složitých struktur.
Argumenty předávané skriptu
Skriptu je možné předávat hodnoty pomocí argumentů. K tomu slouží deset tzv. pozičních parametrů, které odpovídají speciálním shellovským proměnným 0
až 9
. Proměnná 0
přitom obsahuje první slovo příkazové řádky, což je jméno skriptu. Proměnné 1
až 9
pak obsahují hodnoty předávaných argumentů. Dalšími užitečnými speciálními proměnnými jsou #
(počet argumentů) a *
(vypíše všechny argumenty).
Vytvořte následující soubor, který pojmenujte součet.
gedit ~/soucet
Do souboru vložte následující řádky
# Skript pro soucet dvou cisel echo "Soucet cisel " $1 " a " $2 " je " `expr $1 + $2` "." echo "Pocet zadanych paremetru je " $# "." echo "Jedna se o nasledujici parametry: " $* exit
Soubor soucet
uložte a nastavte právo spuštění
chmod u+x ~/soucet
a daný skript spusťte.
~/soucet 7 8 Soucet cisel 7 a 8 je 15 . Pocet zadanych parametru je 2. Jedna se o nasledujici parametry: 7 8
Poznámka: Teoreticky by měl každý skript končit příkazem exit
. Skript však skončí i bez tohoto příkazu tím, že se provede poslední řádek daného skriptu.
Příkazy větvení
if
Syntaxe příkazu if
je velice podobná jiným programovacím jazykům. V Linuxu jsou k dispozici následující tři typy syntaxí.
if vyraz then prikazy fi
if vyraz then prikazy else prikazy fi
if vyraz_1 then prikazy elif vyraz_2 then prikazy else prikazy fi
Výraz vyraz
nepředstavuje výraz typu boolean, ale návratovou hodnotu daného výrazu.
# ilustracni priklad if x=`expr 1 '+' 1` then echo "pravda" else echo "nepravda" fi exit ./skript pravda
# ilustracni priklad if x=`expr 1 '+' a` then echo "pravda" else echo "nepravda" fi exit ./skript expr: non-numeric argument nepravda
Jestliže chcete, aby výraz vyraz
představoval výraz typu boolean, je zapotřebí použít příkaz test
.
# ilustracni priklad if test 0 -le 1 then echo "pravda" else echo "nepravda" fi exit ./skript pravda
# ilustracni priklad if test 2 -le 1 then echo "pravda" else echo "nepravda" fi exit ./skript nepravda
Vedle operátoru -le
(menší nebo rovno) je také možné používat operátory v níže uvedené tabulce.
Operátor | Význam |
---|---|
-le | je menší nebo rovno |
-lt | je menší než |
-ge | je větší nebo rovno |
-gt | je větší než |
= | je rovno |
!= | je různé od |
Dále je možné používat také speciální „operátory“, které testují status souboru. Následující skript např. zjistí, zda-li v pracovním adresáři existuje soubor text.txt
.
# ilustracni priklad if test -f "text.txt" then echo "pravda" else echo "nepravda" fi exit
Následující tabulka představuje kompletní seznam těchto speciálních přepínačů.
Operátor | Význam |
---|---|
-e | existuje |
-f | existuje a je obyčejným souborem |
-r | existuje a lze jej číst |
-w | existuje a je možné do něj zapisovat |
-x | existuje a je možné jej spustit |
-s | existuje a má nenulovou velikost |
-d | existuje a je adresářem |
case
Tuto funkci lze použít k zjednodušení komplexnějších kontrukcí obsahujících podmínku. Syntaxe je obdobná jako v jiných programovacích jazycích.
# NAZEV SKRIPTU: vypocti # ilustracni priklad case $2 in '+' | soucet) expr $1 '+' $3;; '-' | rozdil) expr $1 '-' $3;; '*' | soucin) expr $1 '*' $3;; '/' | podil ) expr $1 '/' $3;; *) echo "Neznamy operator!";; esac exit ./vypocti 6 / 2 3 ./vypocti 6 podil 2 3 ./vypocti 6 deleno 2 Neznamy operator!
Výše uvedený skript vyžaduje tři parametry. Skript podle hodnoty druhého parametru určí typ matematické operace. Následně provede příslušnou operaci s prvním a třetím parametrem. V kódu je také ošetřen případ, kdy druhý parametr nenabyde žádné z očekávaných hodnot.
Konstruktory && a ||
Konstruktory &&
a ||
lze v jednodušších případech použít namísto příkazu if
.
Konstruktor &&
provede příkaz, který ho následuje, jestliže je hodnota předchozího příkazu nula.
uname | grep Linux && echo "Pouzivate system typu Linux."
Konstruktor ||
je podobný konstruktoru &&
s tím rozdílem, že se následující příkaz provede pouze v případě, že hodnota předcházejícího příkazu bude různá od nuly.
uname -m | grep i686 || echo "Pouzivate jinou nez i686 architekturu."
Cykly
for
Příkaz for
má několik možných syntaxí.
Následující syntaxe způsobí, že cyklus proběhne tolikrát, kolik je zadáno parametrů, přičemž proměnná x
nabude postupně hodnot všech parametrů. Níže uvedený příklad postupně vypíše hodnoty jednotlivých parametrů skriptu.
# ilustracni priklad for x do echo "Parametr: $x" done ./skript 1 2 3 Parametr: 1 Parametr: 2 Parametr: 3
Níže uvedený cyklus proběhne tolikrát, kolik je uvedeno hodnot za klíčovým slovem in
. Při průchodu cyklem bude nabýt proměnná x
postupně nabývat těchto hodnot.
# ilustracni priklad for x in `ls -d *` do echo "V pracovnim adresari se nachazi soubor / adresar: "$x done
while
Příkaz while
nejprve vyhodnotí výraz vyraz
. V případě, že je vyraz
roven nule, provede se tělo cyklu. Cyklus bude probíhat tak dlouho, dokud nebude hodnota výrazu vyraz
různá do nuly. V tomto případě bude skript pokračovat prvním řádkem za cyklem.
while vyraz do prikazy done
Ve výrazu vyraz
je možne používá následující operátory:
Operátor | Význam |
---|---|
-le | je menší nebo rovno |
-lt | je menší než |
-ge | je větší nebo rovno |
-gt | je větší než |
= | je rovno |
!= | je různé od |
Následující skript vypíše čísla od 1 do 100.
# NAZEV SKRIPTU: skript # ilustracni priklad a=1 while [ $a -le 100 ] do echo $a a=`expr $a '+' 1` done
until
Příkaz until
je velice podobný příkazu while
. Jediný rozdíl je v tom, že tělo cyklu bude probíhat tak dlouho, dokud logická hodnota výrazu vyraz
nebude nulová.
until vyraz do prikazy done
V rámci příkazu until
lze používat naprosto stejné operátory jako v případě while
.
Následující ilustrační skript vypíše čísla od 110 do 100.
# NAZEV SKRIPTU: skript # ilustracni priklad a=111 until [ $a = 100 ] do a=`expr $a '-' 1` echo $a done
Přerušení cyklu
K přerušení cyklu slouží příkazy break
a continue
.
Příkaz break
slouží k opuštění těla cyklu - skript tak pokračuje prvním řádkem za tělem cyklu.
# NAZEV SKRIPTU: skript # ilustracni priklad for x in $* do case $x in [0-9]) echo $x "je ciselny parametr." ; expr $x '*' $x;; *) echo $x "neni ciselny parametr!" ; break;; esac done exit ./skript 8 9 8 je ciselny parametr. 64 9 je ciselny parametr. 81 ./skript 8 a 9 8 je ciselny parametr. 64 a neni ciselny parametr!
Příkaz continue
narozdíl od příkazu break
neopustí tělo cyklus, ale pouze opustí aktuální cyklus a pokračuje dalším cyklem.
# NAZEV SKRIPTU: skript # ilustracni priklad for x in $* do case $x in [0-9]) echo $x "je ciselny parametr." ; expr $x '*' $x;; *) echo $x "neni ciselny parametr!" ; continue;; esac done exit ./skript 8 9 8 je ciselny parametr. 64 9 je ciselny parametr. 81 ./skript 8 a 9 8 je ciselny parametr. 64 a neni ciselny parametr! 9 je ciselny parametr. 81
Funkce
V shellu je možné definovat funkce, které umožňují redukovat množství kódu a tím přispět k jeho zpřehlednění. Funkce se chová jako libovolný příkaz. To znamená, že je schopna přebírat hodnoty argumentů a vrací hodnotu.
jmeno_funkce () { prikazy }
Následující funkce vyhledá soubory a adresáře. Jako prvni parametr je zadána část jména hledaného souboru popř. adresáře. Ostatní parametry představují adresáře, které mají být prohledány. Je-li zadán pouze první parametr, prohledává se celý systém souborů.
# NAZEV SKRIPTU: skript # ilustracni priklad searchfile() { case $# in 0) echo "Please specify a file / directory to be found.";; 1) echo "Searching in root directory." find / -name "*$1*";; *) for x in $2 $3 $4 $5 $6 $7 $8 $9 do echo "Searching in directory "$x"." find $x -name "*$1*" done;; esac return 0 }
Poznámka: Funkce se narozdíl od skriptů ukončují příkazem return, který je následován tzv. návratovou hodnotou. Standardně se jako návratová hodnota používá nula.
Aby bylo možné funkci používat, je třeba nejprve načíst soubor, který obsahuje definice funkcí. Přesuňte se do adresáře, který obsahuje tento soubor a do příkazové řádky zadejte
. jmeno_souboru_s_funkcemi
Po té je možné funkci spouštět přímo z příkazové řádky jako běžný příkaz. Výše definovanou funkci je možné např. spustit pomocí
searchfile txt /opt /home ... text.txt ...
Konfigurační soubory .bashrc a rc.local
Jestliže chcete, aby se určité příkazy, skripty nebo aliasy automaticky spouštěly při přihlášení se do systému, je třeba je přidat do konfiguračních souborů.
Konkrétně se jedná soubor .bashrc
, který se nachází v domovském adresáři uživatele, a soubor rc.local
, který se nachází v adresáři /etc/rc.d
. V případě, že chcete, aby se příkaz, skript nebo alias spouštěly pouze při přihlášení určitého uživatele, modifikujte .bashrc
, který se nachází v jeho domovském adresáři. Jestliže naopak chcete, aby se spouštěly při každém přihlášení, přidejte je na konec souboru rc.local
v adresáři /etc/rc.d
.
Periodické spouštění procesů
- Přečtěte si kapitolu Obecné poznámky.
cron
Jestliže chcete spouštět skript18) s určitou periodicitou, stačí ho přidat do některého z adresářů /etc/cron.*
. Konkrétně se jedná o adresáře cron.hourly
, cron.daily
, cron.weekly
, cron.monthly
. Jak už jejich název napovídá, označuje část jejich jména za cron.
periodicitu, se kterou budou tyto skripty spouštěny.
Další možností je vytvořit si vlastní konfigurační soubor crontab
a umístit jej do adresáře /etc/cron.d
. V tomto konfiguračním souboru je možné definovat nejen periodicitu ale také konkrétní čas, ve kterém má být spuštěn konkrétní příkaz.
Syntaxe tohoto konfiguračního souboru je následující
minuta hodina den mesic den_v_tydnu [jmeno_uzivatele] prikaz
Pole | Popis | Rozsah |
---|---|---|
minuta | minuta příslušného hodiny | 0 - 59 |
hodina | hodina příslušného dne | 0 - 23 |
den | den v měsíci | 1 - 31 |
mesic | měsíc v roce | 1 - 12 |
den_v_tydnu | den v týdnu | 0 - 6 (0 = neděle) |
Každé pole navíc může obsahovat znak:
- hvězdička (
*
), které vyhovuje všem časům - dvě čísla oddělená pomlčkou, která značí rozsah hodnot
- seznam čísel popř. rozsahů oddělených čárkou
jmeno_uzivatele
umožňuje superuživateli nastavit uživatele, jehož jménem má být příkaz spouštěn. Jestliže není jméno uživatele nastaveno, bude příkaz spouštěn z shellu superuživatele.
Následující konfigurační soubor spusti prikaz1
1.ledna v 12:00, prikaz2
každý pracovní den ve 3:00 a příkaz prikaz3
každou hodinu.
#crontab - ilustracni priklad 0 12 1 1 * prikaz1 0 3 * * 1-5 prikaz2 0 * * * * prikaz
Poznámka: Potenciální problémy by mohly nastat při zadávání hodnot do polí den
a den_v_tydnu
. Pro spuštění příkazu totiž stačí, aby byla splněna kterákoliv z těchto podmínek. Konfigurační soubor
#crontab - ilustracni priklad 0 12 1 * 5 prikaz
tak nespustí prikaz
vždy ve 12:00 prvního dne v měsíci pokud se jedná o pátek, ale vždy ve 12:00, jestliže bude pátek nebo první den v měsíci.
O spouštění souborů v adresáří /etc/cron.*
a souboru /etc/cron.d/crontab
se stará démon cron
. Ten je spouštěn společně se systémem a běží neustále na pozadí.
Poznámka: cron
předpokládá, že systém běží neustále. Narozdíl od serverů tento předpoklad v případě klasických domácích počítačů pochopitelně neplatí. Pro tyto případy je vhodnější podobná utilita anacron
, která přebírá instrukce ze souboru /etc/anacrontab
. anacron
se postará o to, aby nedošlo k přeskočení některých příkazů z důvodů časové diskontinuity (např. z důvodu vypnutí počítače nebo přenastavení systémového času).
at
Jestliže chcete spustit příkaz či skript v danou dobu a nechcete k tomu použít cron
, máte k dispozici příkaz at
. Následující příkaz vypne počítač ve 23:00.
at 11pm at> /sbin/shutdown -h now at>
Stiskněte Ctrl+D.
Job at 2007-01-04 23:00
Další informace
man
Bližší informace o výše uváděných příkazech můžete získat pomocí
man prikaz
Např. manuálovou stránku příkazu ls
vyvoláme pomocí
man ls LS(1) User Commands LS(1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuSUX nor --sort. ...
info
Dalším užitečným příkazem pro získání nápovědy je info
. Nápověda získaná pomocí tohoto příkazu je často komplexnější než nápověda poskytovaná klasickým man
. info
narozdíl od man
nabízí navíc hyperlinky, které propojují jednotlivé kapitoly nápovědy.
info ls File: coreutils.info, Node: ls invocation, Next: dir invocation, Up: Directory listing 10.1 `ls': List directory contents ================================== The `ls' program lists information about files (of any type, including directories). Options and file arguments can be intermixed arbitrarily, as usual. For non-option command-line arguments that are directories, by default `ls' lists the contents of directories, not recursively, and omitting files with names beginning with `.'. For other non-option arguments, by default `ls' lists just the file name. If no non-option argument is specified, `ls' operates on the current directory, acting as if it had been invoked with a single argument of `.'. ...
apropos
Informace uvedené v sekci NAME jsou využívány příkazem apropos
. Tento příkaz vypisuje seznam manuálových stránek, které se váží k určitému klíčovému slovu. Pokud toto klíčové slovo figuruje v sekci NAME, je daná manuálová stránka vypsána na seznam.
Například seznam všech manuálových stránek, které se váží ke slovu file, získáte pomocí
apropos file
text_a.txt
a text_A.txt
tak jsou dva rozdílné soubory.-
, adresáře pak písmenem d
..
představuje pracovní adresář a znak ..
nadřazený adresář. Tyto dva adresáře jsou součástí všech adresářů./
je tzv. kořenovým adresářem. Všechny adresáře jsou podadresáři tohoto adresáře. Každý diskový oddíl musí být „namapován“ do některého z adresářů. Proto, dáte-li prohledat kořenový adresář, prohledáváte všechny připojené diskové oddíly počítače.d
./home/jmeno_uzivatele
..doc
, .xls
apod. - musí být tištěny z odpovídající aplikace.