Síla operačního systému Unix spočívá v používání malých a jednoduchých příkazů, které se sami o sobě zdají neužitečné. Pokud se je naučíte spojovat dohromady, vytvoříte systém, jenž je mnohem pružnějií a výkonnijií než všechny ostatní operační systémy. V této kapitole se budeme zabývat příkazy sort, grep, more, cat, wc, spell, diff a tail. Z názvů těchto programů nelze bohužel intuitivně předpokládat, jakou funkci plní.
Nejdříve se budeme věnovat každému příkazu odděleně a nakonec uvedeme několik příkladů, jak je spojovat a používat dohromady.
Kromě příkazů cd, mv a rm, o kterých jsme se zmínili v kapitole 4, existují další příkazy určené k manipulaci se soubory (a nikoliv s daty, jež soubory obsahují). Patří mezi ně touch, chmod, du a df. ”ádný z těchto příkazů se nestará o obsah souborů - pouze mění některé jejich atributy, se kterými operační systém Unix pracuje.
Uveďme si seznam atributů, se kterými uvedené příkazy manipulují:
Časové údaje - S každým souborem jsou spjaty tři časové údaje. První časový údaj obsahuje informaci o době vytvoření souboru, druhý o době jeho poslední modifikace a třetí o době, kdy byl naposledy zpřístupněn.
Vlastník souboru - Každý soubor v operačním systému Unix je vlastněn některým uživatelem.
Skupina - Každý soubor je také spojen se skupinou uživatelů. Nejčastěji se tato skupina nazývá users, což znamená, že soubor je sdílen každým uživatelem poihláieným do systému.
Přístupová práva - Každý soubor má přístupová práva (pro která se někdy používá označení privilegia). Jedná se o mechanismus, jenž určuje, kdo může k danému souboru přistupovat, kdo může spouštět dané programy a podobně. Každé z přístupových práv může být odděleně přiřazeno vlastníku souboru, skupině nebo všem uživatelům operačního systému.
touch soubor1 soubor2 ... souborN
Příkaz touch provede aktualizaci časových údajů každého souboru uvedeného jako parametr - nastaví čas vytvoření na aktuální čas. Pokud soubor uvedený jako parametr neexistuje, program touch jej vytvoří. Je také možné specifikovat čas, který má být souborům přiřazen. Podrobnosti si nastudujte v manuálových stránkách.
chmod [-Rfv] mód soubor1 soubor2 ... souborN
Příkaz umožňující změnit přístupová práva se nazývá chmod (change mode). Než se pustíme do jeho popisu, musíme si probrat, jaká přístupová práva operační systém Unix bere v úvahu. Každý soubor je spojen se skupinou přístupových práv. Podle těchto přístupových práv operační systém Unix určuje, zda může být soubor čten, zda do něj může být zapisováno, nebo, jedná-li se o spustitelný program, může být spuštěn. V následujících odstavcích budeme hovořit o přístupových právech uživatelů. Každý program, jenž uživatel spustí, má shodná přístupová práva. Pokud přesně nevíte, co program dělá, mohou nastat problémy s bezpečností systému.
Operační systém Unix rozlišuje tři různé typy uživatelů. Prvním z nich je vlastník souboru. Tím je osoba, která má právo v souvislosti s tímto souborem používat příkaz chmod. Druhý typ představuje skupina. Většina souborů ve vašem systému by měla mít přiřazen atribut “users”, a tak by měla být přístupna každému normálnímu uživateli. Chcete-li znát hodnotu atributu skupina, zadejte příkaz ls -l file.
Nakonec operační systém identifikuje ty osoby, které nejsou ani vlastníky žádného souboru, ani členové žádné skupiny. Pro ty je vyhrazen atribut “other” (ostatní). Typické nastavení přístupových práv je: pro vlastníka právo číst soubor a zapisovat do souboru, pro skupinu právo číst soubor a pro ostatní jsou všechna práva potlačena. Může se však stát, že skupina má právo soubor číst i do něj zapisovat a přitom vlastník nemá žádná práva.
Nyní si vyzkoušejme, jak pomocí příkazu chmod změnit některá přístupová práva. Nejdříve si vytvořte nový soubor, řekněme pomocí příkazu cat nebo pomocí editoru Emacs. Implicitně je vám přiděleno právo soubor číst i právo do něj zapisovat. Práva ostatních uživatelů jsou určena podle toho, jak je nastaven váš systém a jak je nastaven proces přihlaýování. Ujistěte se, že nově vytvořený soubor jste schopni číst pomocí příkazu cat. Nyní si odeberte právo číst tento soubor pomocí příkazu chmod u-r filename. Parametr u-r se interpretuje jako “user minus read”. Když se nyní pokusíte soubor přečíst, obdržíte chybové hlášení Permission denied!. Chcete-li získat zpět právo soubor číst, zadejte příkaz chmod uCtrl+r filename.
Přístupová práva k adresářům používají stejné atributy (pro čtení, zapisování a spouštění), ale poněkud odliiným způsobem je interpretují. Právo číst znamená, že uživatel, skupina nebo ostatní mohou vypisovat seznam souborů v adresáři. Právo zapisovat znamená, že uživatel, skupina nebo ostatní mohou přidávat soubory do adresáře nebo rušit soubory. Právo spouštět znamená, že uživatel může zpřístupňovat soubory v adresáři i v jeho podadresářích. Pokud nemá uživatel žádná práva, nemůže ani použít příkaz cd.
Při používání příkazu chmod se specifikuje, kdo má k danému souboru přístupová práva práva (uživatel, skupina, ostatní nebo všichni). Dále se specifikují atributy, které definují, co se s daným souborem může dělat. Znaménko plus indikuje udělení daného práva, znaménko mínus popření. Pomocí znaménka rovná se (=) se specifikují přesná přístupová práva. Přípustná přístupová práva jsou read (čtení), write (zápis) a execute (spouštění).
Pokud se použije v příkazu chmod volba R, pak se změna přístupových práv týká všech souborů v adresáři a všech podadresářů (R je označením pro rekurzivní). Jestliže se použije volba f, pak se příkaz chmod pokusí změnit přístupová práva práva i v případě, že uživatel není vlastníkem daného souboru. Zadá-li se volba v, pak bude příkaz chmod podrobně vypisovat informace o všech krocích, které realizuje.
Příkazy uvedené v tomto oddílu jsou určeny k výpisu informací o systému nebo o jeho částech.
du [-abs] [cesta1 cesta2 ... cestaN]
Příkaz du je zkratkou pro “disk usage” (využívání disku). Zobrazuje informaci o velikosti diskového prostoru, který je přidělen danému adresáři a všem jeho podadresářům. Samotný příkaz du zobrazuje seznam, jehož položky uvádějí u každého adresáře velikost diskového prostoru (který adresář obsazuje), kolik prostoru obsazuje aktuální adresář a jako poslední udává velikost diskového prostoru spotřebovanou aktuálním adresářem a všemi jeho podadresáři.
Pokud příkazu du předáte nějaké parametry (jméno souboru nebo adresáře), pak vám vypíše uvedené informace o tomto souboru či adresáři.
Použije-li se volba a, pak se vypíší uvedené informace jak o souborech, tak i o adresářích. Po zadání volby b se informace o velikosti diskového prostoru nebudou uvádět v kilobajtech, ale přímo v bajtech. Jeden bajt je ekvivalentní jednomu znaku v textovém souboru. Pokud se použije volba s, pak příkaz du vypíše zmíněné informace o adresářích uvedených jako parametry a nikoliv o jejich podadresářích.
df
Příkaz df je zkratkou pro “disk filling”. Sumarizuje množství použitého diskového prostoru. Pro každý souborový systém (připomeňme, že souborový systém zaujímá buď samostatný disk, nebo samostatný diskový oddíl) vypíše informaci o celkovém množství diskového prostoru, informaci o velikosti použité části, o volné kapacitě a nakonec o celkové kapacitě souborového systému.
Paradoxně se může stát, že se vám zobrazí kapacita větší než 100 %. Je to způsobeno tím, že operační systém Unix rezervuje pro každý souborový systém jistý prostor pro superuživatele. Proto je zajištěno, že i když uživatel zaplní celý disk, zůstává na disku něco málo volného místa, aby se mohly realizovat některé operace. Pro většinu uživatelů nemá příkaz df žádné užitečné volby.
uptime
Příkaz uptime dělá přesně to, co byste podle jeho názvu očekávali. Vypisuje celkový čas, který uplynul od posledního zavedení operačního systému. Dále příkaz uptime uvádí informaci o aktuálním čase a o tzv. “load average”. Termínem “load average” se míní průměrný počet úloh čekajících na spuštění v průběhu daného časového intervalu. Příkaz uptime uvádí tyto hodnoty pro poslední minutu, posledních pět minut a posledních deset minut. Jestliže se hodnota “load average” blíží k nule, pak to znamená, že je systém téměř nevytížen. Hodnota blízká k jedničce znamená, že je systém plně vytížen, ale není zahlcen. Vysoké hodnoty jsou výsledkem skutečnosti, že v systému běží několik programů současně. Příkaz uptime patří k několika málo programům operačního systému Unix, které nemají parametry a žádné volby. (V nových verzích programu uptime, který je součástí balíku procps, je akceptována volba V, která je určena pro zobrazení verze balíku procps).
who
Příkaz who slouží k zobrazení seznamu momentálně poihláiených uživatelů systému. Pokud se k příkazu přidají parametry am i, pak se zobrazí informace o aktuálním uživateli.
w [-f] [uživatelské jméno]
Příkaz w zobrazuje informace o momentálních uživatelích operačního systému a informace o tom, co dělají. V podstatě tento příkaz kombinuje příkazy uptime a who. Záhlaví výstupu z příkazu w je přesně stejné jako v případě příkazu uptime a každý řádek obsahuje informace o uživateli, například kdy se přihlásil. Kolonka JCPU ukazuje celkový čas procesoru, který uživatel spotřeboval, zatímco kolonka PCPU ukazuje celkový čas procesoru spotřebovaný jejich momentálně běžící úlohou.
Jestliže u příkazu w uvedete volbu f, pak se nezobrazí vzdálený systém, ze kterého je daný uživatel přihlášen (ve výpisu bude chybět kolonka FROM).
V operačním systému Unix existují dva hlavní příkazy pro výpis obsahu souborů cat a more. Již jsme o nich hovořili v kapitole 6.
cat [-nA] [soubor1 soubor2 ... souborN]
Příkaz cat nepatří mezi uživatelsky přátelské příkazy. Nečeká, až si přečtete obsah souboru a spíše se používá v souvislosti s rourami. Má však několik užitečných voleb. Například volba n zajistí, že všechny řádky vypisovaného souboru budou číslovány. Při zadání volby A se budou řídící znaky zobrazovat jako normální znaky a ne jako podivné sekvence paznaků.
Opět připomínáme, že kompletní seznam voleb akceptovatelných příkazem cat naleznete v manuálových stránkách. Pokud se v příkazovém řádku neuvede ani jeden parametr, použije příkaz cat standardní vstup.
more [-l] [+linenumber] [file1 file2 ... fileN]
Příkaz more je mnohem užitečnějií a budete jej často používat zejména k zobrazování souborů ve formátu ASCII. Jedinou zajímavou volbou je l, po jejímž uvedení příkazu more sdělíte, že nechcete interpretovat znak Ctrl-L jako znak “nová stránka”. more zahájí zobrazení od specifikovaného čísla řádku (linenumber). Protože je more interaktivním příkazem, uvádíme v následujícím seznam příkazů, kterými lze jeho činnost řídit.
Mezerník Zobrazí se následující stránka.
d Text se posune o 11 řádků, což je přibližně polovina stránky.
/ Vyhledání regulárního výrazu. Zatímco regulární výraz může být opravdu komplikovaný, můžete zadat textový řetězec, který se má vyhledat. Zadáte-li například /toad Enter, vyhledá se v celém textu řetězec “toad”. Jestliže uvedete jen / Enter, pak se vyhledá další výskyt posledně zadaného řetězce.
n Také tento příkaz je určen k vyhledání posledně zadaného regulárního výrazu.
: n Pokud jste zadali prostřednictvím parametrů více než jeden soubor, zahájí se prohlížení následujícího souboru.
: p Prohlížení se nastaví na předcházející soubor.
q Program more se ukončí.
head [-lines] [file1 file2 ... fileN]
Příkaz head zobrazí prvních deset řádků každého z uvedených souborů nebo prvních deset řádků ze standardního vstupu, pokud žádný soubor není jako parametr v příkazovém řádku uveden. Jakákoliv numerická hodnota uvedená jako volba změní implicitní nastavení deset.
Například head -15 frog zobrazí prvních patnáct řádků souboru frog.
tail [-lines] [file1 file2 ... fileN]
Podobně jako příkaz head zobrazuje příkaz tail jen část souboru. Normálně zobrazuje posledních deset řádků souboru nebo posledních deset řádků ze standardního vstupu. Také akceptuje volbu pro nastavení počtu zobrazených řádků.
file [file1 file2 ... fileN]
Příkaz file se pokouší identifikovat formát souborů uvedených v seznamu v příkazovém řádku. Protože ne všechny soubory mají příponu charakterizující formát souboru nebo neobsahují posloupnosti znaků, podle kterých by se dal formát identifikovat, pokouší se příkaz file provádět některé základní testy a tak odhadnout, co soubor obsahuje.
Buďte opatrní, často se může stát, že je formát souboru identifikován chybně.
Následující oddíl je věnovaný příkazům, které mění soubor, provádějí jisté operace se souborem nebo zobrazují některé statistické informace o souboru.
grep [-nvwx] [-number] expression [file1 file2 ... fileN]
Jeden z nejužitečnějiích příkazů operačního systému Unix je příkaz grep (generalized regular expression parser). Jeho jméno se zdá být příliš nadsazené na to, že jde o program, jenž umí pouze vyhledávat regulární výrazy v textu. Následující příklad demonstruje nejjednoduýší způsob používání příkazu grep:
/home/larry# cat animals
Animals are very interesting creatures. One of my favorite animals is
the tiger, a fearsome beast with large teeth.
I also like the lion---it's really neat!
/home/larry# grep iger animals
the tiger, a fearsome beast with large teeth.
/home/larry#
Z uvedeného příkladu vyplývá jedna nevýhoda. I když příkaz vypsal všechny řádky obsahující hledané slovo, neuvedl, kde se dané slovo v souboru vyskytuje (neuvedl číslo řádku). Někdy to může stačit, v závislosti na tom, co potřebujete udělat. Když například hledáte chyby ve výstupu z programu, stačí zadat příkaz a.out | grep error, kde a.out je jméno vašeho programu.
Jestliže však chcete přesně vědět, kde se hledaný regulární výraz v souboru nachází, zadejte volbu n. Pak bude příkaz grep zobrazovat i pořadová čísla řádků. Volbu v použijte tehdy, když budete chtít zobrazit seznam všech řádků neobsahujících daný regulární výraz.
K dalším vlastnostem příkazu grep patří to, že implicitně vyhledává neúplná slova. V předcházejícím příkladu jsme zadali neúplné slovo iger a grep našel slovo tiger. Jestliže má program grep pracovat pouze s celými slovy, zadejte volbu w. Po zadání volby x bude grep pracovat s celými řádky.
Pokud neuvedete v příkazu grep žádné parametry, bude prohledávat standardní vstup.
wc [-clw] [soubor1 soubor2 ... souborN]
wc je zkratka pro “word count” (počet slov). Tento příkaz spočítá slova, znaky a řádky v souborech uvedených v seznamu. Pokud se v příkazovém řádku neuvedou jako parametry žádné soubory, pracuje příkaz wc se standardním vstupem.
Pro příkaz wc existují tři volby: c (character - znak), l (line - řádek) a w (word - slovo). Pomocí volby se specifikuje, co má program wc počítat. Pokud například zadáte příkaz wc cw, pak spočítá znaky a slova, ale nikoliv řádky. Příkaz zadaný bez voleb spočítá vše - znaky, slova i řádky.
Jedna z aplikací příkazu wc spočívá v tom, že lze s jeho pomocí určit počet souborů v adresáři: ls | wc -w. Pokud chcete například vědět, kolik souborů končí s příponou .c, pak zadejte příkaz ls *.c | wc -w.
spell [soubor1 soubor2 ... souborN]
spell je velmi jednoduchý program operačního systému Unix pro kontrolu pravopisu textových souborů. Zpravidla kontroluje pravopis americké angličtiny. Program spell je tedy filtr, který prochází soubor ve formátu ASCII a na výstupu vypisuje slova, která považuje za pravopisně nesprávná. spell pracuje se soubory uvedenými v příkazovém řádku jako parametry, jinak zpracovává standardní vstup.
Pravděpodobně máte k dispozici i dokonalejší program pro kontrolu pravopisu ispell. Program ispell navíc nabízí možnosti opravy chybně napsaného slova. Pokud se v příkazovém řádku specifikuje soubor, pak se program ispell ovládá pomocí nabídky, jinak pracuje jako klasický filtr.
Chcete-li se dozvědět o programu ispell více, podívejte se do manuálových stránek.
cmp soubor1 [soubor2]
Příkaz cmp porovnává obsahy dvou souborů. První musí být uveden jako parametr v příkazovém řádku, druhý je buď specifikován jako parametr, nebo se čte ze standardního vstupu. Příkaz cmp je velmi jednoduchý a jeho úkolem je ukázat, kde se dva soubory liší.
diff soubor1 soubor2
Jedním z nejkomplikovanějších standardních programů operačního systému Unix je příkaz diff. GNU verze programu diff má více než dvacet voleb! Jedná se o zdokonalenou verzi programu cmp, která ukazuje nejen kde se soubory liší, ale také v čem se liší.
Nebudeme probírat kompletní možnosti programu diff, protože to překračuje rámec této knihy. Místo toho se zaměříme na základní operace. Krátce řečeno, program diff akceptuje jako parametry dva soubory a zobrazí rozdíly mezi nimi na principu “řádek po řádku”.
Uveďme si příklad:
/home/larry# cat frog
Animals are very interesting creatures. One of my favorite
animals is
the tiger, a fearsome beast with large teeth.
I also like the lion---it's really neat!
/home/larry# cp frog toad
/home/larry# diff frog toad
/home/larry# cat dog
Animals are very nteresting creatures. One of my favorite animals is the tiger, a fearsome beast with large teeth. I also like the lion---it's really neat!
/home/larry# diff frog dog
1c1,2
< Animals are very interesting creatures. One of my favorite animals is
> Animals are very nteresting creatures. One of my favorite animals is
>
3c4
< I also like the lion---it's really neat!
--> I also like the lion---it's really neat!
/home/larry#
Jak vidíte v našem příkladu, program diff neprodukuje žádný výstup, pokud jsou soubory identické. Pokud se porovnávaly dva různé soubory, pak řádek 1c1,2 říká, že byl porovnán první řádek levého souboru (frog) s prvním a druhým řádkem pravého souboru (dog) a že zde byly nalezeny rozdíly. Pak byly porovnány řádky 3 (v souboru frog) a 4 (v souboru dog) a i zde byl nalezen rozdíl. Může se zdát podivné, že se nejdříve porovnávají řádky s různým pořadovým číslem. Je to však z toho důvodu, aby program pracoval efektivněji.
gzip [-v#] [soubor1 soubor2 ... souborN]
gunzip [-v] [soubor1 souborX (x Î{1,2,...,N})]
zcat [soubor1 soubor2 ... souborN]
Tyto tři programy se používají ke kompresi a dekompresi dat.
Příkaz gzip (GNU zip) je program, který čte původní soubory a produkuje soubory menší.
Přitom soubory specifikované v příkazovém řádku ruší a nahrazuje je komprimovanými soubory. Komprimované soubory mají stejná jména, ale navíc mají příponu “gz”.
tr řetězec1 řetězec2
Příkaz tr (translate characters) pracuje pouze se standardním vstupem - neakceptuje žádné soubory jako parametry. Jeho dvěma parametry jsou dva řetězce. Příkaz nahradí všechny výskyty znaků řetězce řetězec1 na vstupu odpovídajícím znakem z řetězce řetězec2. Kromě relativně jednoduchého tvaru tohoto příkazu, například tr frog toad, může příkaz tr akceptovat poměrně složité příkazy. Uvedeme si příklad, kdy se pomocí příkazu tr převádějí malá písmena na velká:
/home/larry# tr [:lower:] [:upper:]
this is WEIRD sentence.
THIS IS WEIRD SENTENCE.
/home/larry#
Program tr je dosti složitý a často se využívá v malých programech pro příkazové procesory.