[[obsah|Hlavní stránka]] ===== Základy příkazové řádky ===== {{:navody:48x48:apps:utilities-terminal.png?60 }} I když již není znalost unixových příkazů pro soužití s //Linux//em 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žijete 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 program, který umožňuje uživateli komunikovat s počítačem prostřednictvím jednoduchých příkazů zapisovaných pomocí klávesnice. Pro unixové systémy bylo vyvinuto několik //shell//ů. Standardním //shell//em je //bash//, který bude s největší pravděpodobností také součástí Vaší instalace. //Bash// je akronymem sousloví "**B**ourne **A**gain **SH**ell" a je pokračovatelem původního //shell//u, který napsal Stephen Bourne koncem 70.let. Samotný //bash// pak pochází z roku 1987.\\ Zadávané příkazy vykonává buď přímo //shell// nebo jsou to programy v podobě spustitelných souborů (viz. kapitola [[prompt#Definování přístupových práv]]). Většina těchto souborů je 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 [[prompt#Proměnná PATH]]).\\ S pojmem příkaz je velice často spojován pojem přepínač. Přepínač 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:** Příkazy uvedené v této kapitole není ani zdaleka vyčerpávající. **Poznámka:** Interní příkazy //shellu// vypíše příkaz ''help''. ==== Terminál ==== Příkazový řádek otevřete pomocí aplikace //Terminál//. Jedná se o výchozí aplikaci, ale v //Software// naleznete celou řadu alternativ. Stačí se podívat do kategorie //Systém->Terminálové emulátory//.\\ 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ě //Linux//u 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''((//OS Linux// narozdíl od //OS Windows// rozlišuje malá a velká písmena v názvech souborů a adresářů. Soubor ''text_a.txt'' a ''text_A.txt'' tak jsou dva rozdílné soubory.)), ''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é //shell//em 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"((Jestliže se nejedná o interaktivní příkaz jakým je např. textový editor.)) 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 //Linux//u 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ům((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í [[prompt#Definování přístupových práv|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 1//kB//. 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 1//kB//. 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 //Linux//u si přečtěte kapitolu [[hardware#Disky a mechaniky CD/DVD]]. ====Práce se soubory==== Každý soubor a adresář((Adresář je, pro někoho možná překvapivě, z pohledu systému souborů také souborem, i když se jedná o soubor s pevně danou strukturou.)) 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živatele((Superuživatel je administrátorem systému - tj. provádí nejrůznější nastavení, instalaci aplikací, vytváří a ruší uživatelské účty apod. Z tohoto důvodu potřebuje šiřší pravomoce než má standardní uživatel. Anglické označení pro superuživatele je root.)) - 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 [[prompt#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 souboru((Klasické soubory jsou označeny pomlčkou ''-'', adresáře pak písmenem ''d''.)) a tzv. [[prompt#Definování přístupových práv|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 souboru((Znak ''.'' představuje pracovní adresář a znak ''..'' nadřazený adresář. Tyto dva adresáře jsou součástí všech adresářů.)). === 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 1//kB// 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ářů((Příkaz sice nemůže fyzicky přesunout adresář, ale můžeho ho přejmenovat.)). 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ému((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.)). 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é. //Unix//ové 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ů((Pro naše momentální účely lze "systém souborů" chápat jako diskový oddíl.)). 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. //inode//((Každý diskový oddíl má přidělenu vlastní sadu //inodů//. //Inody// obsahují informace týkající se fyzického uložení souborů a adresářů na příslušném diskovém oddílu a jsou jedinečné pouze v rámci tohoto diskového oddílu. Z toho pramení např. ta nevýhoda, že pevný link musí odkazovat pouze na soubor, který se nachází na stejném diskovém oddílu jako samotný link.)).\\ 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-DOS//u. 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 {{ navody:mc.png }} ==== 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 //Linux//u speciální význam, musí být uzavřen do uvozovek (více viz. kapitola [[prompt#Použití závorek a zpětného lomítka|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 //Linux//u speciální význam, musí být uzavřen do uvozovek (více viz. kapitola [[prompt#Použití závorek a zpětného lomítka|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 === nano === //nano// není příkazem ale jednoduchým textovým editorem. Pomocí této aplikace je možné provádět úpravy konfiguračních a textových souborů. {{ navody:nano.png | nano }} Tuto aplikaci nainstalujete pomocí yum -y install nano popř. přímo z instalačního CD pomocí umount /dev/cdrom mount -t iso9660 /dev/cdrom /mnt rpm -ivh /mnt/Packages/nano*.rpm za předpokladu, že Vaše //DVD// mechanika má soubor zařízení ''/dev/cdrom''. Jestliže chcete pomocí tohoto textového editoru otevřít / vytvořit soubor ''text.txt'' stačí do příkazové řádky zadat nano cesta_k_souboru/text.txt Nápověda k ovládání aplikace je zobrazena u dolního okraje příslušného okna. Znak ''^'' představuje klávesu //Ctrl//. Např. změny uložíte pomocí klávesové zkratky //Ctrl + O// a aplikaci opustíte pomocí //Ctrl + X//. ==== Definování přístupových práv ==== Jak již bylo zmíměno v kapitole [[prompt#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í)((Vedle majitele souboru / adresáře může o těchto právech rozhodovat také superuživatel. Jakákoliv nastavení provedená vlastníkem souboru / adresáře nemají vliv na práva superuživatele - ta jsou totiž vždy "absolutní".)). 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ík((Práva může dokonce upravit také sama sobě. To však nemá dopad na možnost toto nastavení kdykoliv změnit.)). 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 soubor((Adresář by byl indikován znakem ''d''.)). Následující trojice znaků značí práva vlastníka souboru - jedná se o právo čtení (**r**ead), zápisu (**w**rite) a spouštění (e**x**ecute). 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// (**u**ser) pro označení vlastníka, //g// (**g**roup) pro označení skupiny a //o// (**o**ther) pro označení ostatních uživatelů. Práva pak označujeme písmeny //r// (**r**ead) pro čtení, //w// (**w**rite) pro zápis a //x// (e**x**ecute) 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áři((Domovským adresářem rozumíme adresář ''/home/jmeno_uzivatele''.)). ==== Ří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ů((Tento příkaz se hodí zejména pro zpacifikování "neposlušných" procesů.)). 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 proces((Asi nemá smysl zdůrazňovat, že bezhlavé zabíjení procesů může mít za následek kolaps systému.)). **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 //shell//u, 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 //shell//u až do jeho ukončení. V případě, že chcete proměnnou odstranit před ukončením //shell//u, 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 //shell//u. 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 //shell//u, 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 //Linux//u speciální význam. Proto je třeba tyto operátory pomocí apostrofů "ochránit" před interpretací //shell//em (více viz. kapitola [[prompt#Použití závorek a zpětného lomítka|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'' ([[uvod#Unix |System V]]) a ''lpr'' ([[uvod#Unix |BSD]]). V //Linux//u jsou z důvodu kompatibility obsaženy oba příkazy. Jedná se však o stejnou funkcionalitu tiskového systému [[tisk | 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é soubory((Ostatní soubory - např. s příponou ''.doc'', ''.xls'' apod. - musí být tištěny z odpovídající aplikace.)). 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 //shell//u, a proto je rychlejší než alias, který je spouštěn v "pod//shell//u". 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 //shell//em 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 [[prompt#definovani_pristupovych_prav|spouštění]]. Tento soubor obsahuje posloupnost příkazů prováděných //shell//em - 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 //shell//ovský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 //Linux//u 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 //shell//u 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 [[obsah|Obecné poznámky]]. === cron === Jestliže chcete spouštět skript((Skript je soubor, který obsahuje posloupnost příkazů a který má nastaveno právo spouštění.)) 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 //shell//u 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 ---- [[obsah|Hlavní stránka]]