· Minulá kapitola · Obsah · Další kapitola

Přístup k unixovým příkazům nabízí aplikace Terminal. Jistěže jednou z velkých výhod Mac OS proti klasickým unixům (SCO, Linux apod.) je to, že běžný uživatel může -- chce-li -- zůstat kompletně na úrovni GUI a terminál a unixový příkazový řádek nemusí v životě ani vidět; na druhou stranu, zkušeným uživatelům nabízí terminál řadu služeb, které v GUI prostě implementovat nejdou. Nemenší výhodou Mac OS proto je i to, že ti, kdo o něj stojí, terminál k dispozici standardně mají.
Většina unixových operačních systémů nabízí celoobrazovkovou konzoli, v lepším případě několik konzolí, mezi nimiž lze přepínat. Mac OS jako obvykle poskytuje mnohem luxusnější služby: Terminal je plnohodnotná GUI aplikace, ve které můžeme otevřít libovolné množství terminálových oken, a která plně spolupracuje s ostatními aplikacemi: máme tedy k dispozici schránku, služby (Services) a tak dále.
Je vhodné projít si předvolby -- můžeme zde nastavit řadu šikovných standardních hodnot, příkladem může být třeba velikost nově otevřeného okna terminálu. V rámci předvoleb můžeme také zvolit požadovaný shell.
Shell, nebo také příkazový procesor, je program, který čte uživatelské příkazy a na jejich základě vyvolává odpovídající akce. V MS DOSu je tedy shellem program COMMAND.COM; za grafický shell bychom v Mac OS mohli označit Workspace Manager.
Operační systémy unixového typu obvykle mívají shellů více, a každý uživatel si může vybrat ten, který mu nejlépe vyhovuje. Rozdíly mezi jednotlivými shelly nejsou zásadní; jde obvykle o drobnosti v míře uživatelského pohodlí; shelly se také často liší sadou speciálních příkazů (např. implementací příkazu "for" pro provádění dalších příkazů v cyklu).
Ze shellů, jež jsou standardně součástí Mac OS, patří mezi luxusnější shell zsh, umístěný v "/bin/zsh". Budeme-li se v tomto školení zmiňovat o příkazech, které jsou pro některý shell specifické, budeme předpokládat, že se jedná právě o zsh. Kromě něj jsou samozřejmě k dispozici i standardní shelly csh nebo sh, a jiný velmi luxusní shell tcsh.
Shelly bývají ve velmi široké míře konfigurovatelné. Podrobný popis možností konfigurace byť jen zsh by daleko přesáhl zaměření tohoto textu; ukážeme si však alespoň jednu konkrétní možnost z mnoha: do souboru "/etc/zshrc" můžeme zapsat příkazy, které zsh provede vždy hned po startu. Mezi šikovné příkazy patří:
prompt='%! %B%3c%(#.#.\>)%b '
nastaví inteligentní prompt, obsahující aktuální adresář (uvidíme jej dále na všech obrázcích);
alias ls='ls -F'
zajistí, že každý soubor ve výpisu bude obsahovat stručné označení svého typu;
setopt menucomplete
setopt histverify
setopt autoremoveslash
nastaví pohodlné doplňování jmen souborů a práci s dříve provedenými příkazy (ukážeme si jej za chvilku);
bindkey \\e expand-or-complete
naváže příkaz "doplnění jména souboru" na klávesu Esc (standardně je na klávese Tab, což by mohlo být trochu matoucí).
Podrobný popis shellu zsh je součástí standardní dokumentace Mac OS X.
Pokud nějaký objekt (soubor, adresář, skupinu souborů) vhodíme myší do okna terminálu, zapíše se do něj odpovídající jméno nebo jména. Bohužel v Mac OS X není terminál dost "chytrý" na to, aby uzavřel jméno objektu do uvozovek; obsahuje-li tedy vhazované jméno mezery nebo jiné speciální znaky, musíme se o to postarat sami.
Naopak, otevření libovolného souboru "přesně stejně, jako kdybychom na něj poklepali ve Workspace Manageru" zajistí příkaz "open":

NeXTStep obsahoval i nesmírně šikovné příkazy "copy" a "paste" pro práci se schránkou; v Mac OS X Serveru sice z mně naprosto nepochopitelných příčin nejsou, ale jejich varianty "xcopy" a "xpaste" jsou zdarma k dispozici od OCSoftware. Více si o nich řekneme níže, až se seznámíme se standardním vstupem a výstupem.
Nabídka příkazů shellu je v unixu skutečně obrovská. V tomto školení se proto seznámíme jen s několika naprosto nejzákladnějšími:
Jména zapisujeme standardním způsobem: lomítka oddělují jednotlivé složky; začíná-li lomítkem celé jméno, vycházíme z kořenové složky, jinak vycházíme ze složky aktuální (při vhodném nastavení shellu ji vidíme v promptu). V takovém případě můžeme využít také speciální jméno "..", které representuje nadřízenou složku.
Další možnost je zahájit jméno tildou (~); je-li za tildou lomítko, representuje tilda domovskou složku aktuálního uživatele, jinak se text za tildou chápe jako jméno uživatele, jehož domovskou složku chceme použít. Všechny tyto případy (spolu s příkazem "cd", o kterém ještě budeme mluvit, a který prostě nastaví zadanou složku jako aktuální) ilustruje následující obrázek (vyjma nejnižšího řádku):

Poslední řádek pak ilustruje jinou službu zsh: pokud zapíšeme jen částečné jméno složky nebo souboru (v našem případě to bylo "/System/A" a stiskneme klávesu pro doplnění (Tab nebo, použili-li jsme příkaz "bindkey", popsaný výše, Esc), zsh ihned doplní nejbližší možné jméno složky nebo souboru a pod řádek navíc vypíše všechny možnosti doplnění, jež jsou k dispozici. Další stisknutí téže klávesy bude postupně tyto možnosti procházet.
Nakonec bychom se měli zmínit o tom, že jména souborů a složek v Mac OS X (respektive na jeho vlastních discích, protože Mac OS dokáže pracovat i s disky formátovanými jinak) rozlišují malá a velká písmena -- je to sice samozřejmost, ale v bláznivých prostředích typu Windows bohužel zdaleka nikoli samozřejmá.
Stačí zapsat jméno požadovaného programu a stisknout Enter; shell program ihned spustí. Adresáře, ve kterých se program hledá, jsou uloženy v proměnné shellu "path"; prohlédnout si ji můžeme příkazem "set" a změnit příkazem "path=..." (nejlépe v souboru "/etc/zshrc", takže změna bude platit pro všechny v budoucnosti spuštěné Z shelly). Následující příkaz (který mám ve svém /etc/zshrc) přidá ke standardnímu obsahu proměnné "path" navíc adresář "/usr/local/bin":
path=($path /usr/local/bin)
(Vidíme zde také to, že na proměnné se můžeme odkazovat pomocí znaku $.) Můžeme samozřejmě také zapsat jméno programu i s cestou -- např. příkazem "/bin/zsh" spustíme Z shell bez ohledu na obsah proměnné "path".
Za povšimnutí stojí to, že shell standardně nehledá zadaný program na aktivním adresáři! To samozřejmě významně zvyšuje bezpečnost systému. Pokud bychom však takové chování požadovali, není nic jednoduššího -- prostě do cesty přidáme adresář ".".
Chceme-li spustit některou z aplikací, můžeme to ze shellu udělat dvěma způsoby: předně, standardní příkaz "open", o kterém jsme se již zmínili, pracuje i nad jmény aplikací:

Druhý způsob je spuštění aplikace přímo, bez příkazu "open"; v tom případě si ale musíme připomenout, že aplikace není soubor, ale pseudosoubor (package), a namísto "<aplikace>.app" spustit soubor "<aplikace>.app/<aplikace>":

Poslední finta se spouštěním programů, o které se zde zmíníme, je připojení ampersandu (&) na konec příkazu. Standardně totiž terminál čeká, dokud spuštěný program neskončí (povšimněme si na minulém obrázku toho, že za řádkem 22, z něhož jsme aplikaci Find korektně spustili, není žádný další prompt: terminál je nepoužitelný, dokud aplikaci Find neukončíme).
Jestliže naproti tomu na konec řádku napíšeme ampersand:
/System/Applications/Find.app/Find &
(nebo spustíme aplikaci příkazem "open" -- povšimněte si promptu na řádku 21 na předminulém obrázku), terminál aplikaci spustí, nechá ji běžet a ihned nám je opět k dispozici.
Jména více souborů a adresářů, s nimiž chceme pracovat zároveň, můžeme určit podobně jako třeba v MS DOSu pomocí hvězdičky; v unixu však platí i znaky za hvězdičkou (takže např. "*x" odpovídá všem souborům, jejichž jméno končí znakem "x"). Navíc můžeme použít hranaté závorky se seznamem přípustných znaků -- "obr[123].jpeg" odpovídá souborům "obr1.jpeg", "obr2.jpeg" a "obr3.jpeg".
Příkaz "ls" zobrazí obsah běžného adresáře. Zadáme-li přepínač -l, zobrazí u každé položky i detailní údaje.
45 ~\> ls
Applications/ Library/ Projects/ Skoleni/
Information/ Mailboxes/ RootTemp@ sqlnet.log
46 ~\> ls -l sqlnet.log
-rw-r--r-- 1 ocs staff 1008 Jul 24 01:20 sqlnet.log
47 ~\>
Bežný adresář měníme příkazem "cd". Pokud si nejsme jisti, který adresář je právě běžný, můžeme si tuto informaci vyžádat příkazem "pwd". Příkaz "cd" bez parametrů poslouží stejně jako příkaz "cd ~" -- nastaví domovskou složku. Příkazem "cd -" se vrátíme do minulé složky. Velmi šikovný příkaz "pushd" funguje přesně stejně jako "cd", ale navíc si zapamatuje složku, ze které byl proveden, a příkaz "popd" se tam opět vrátí :
48 ~\> cd ~root/Library
49 ~root/Library\> pwd
/Local/Users/Administrator/Library
50 ~root/Library\> cd /
51 /\> pwd
/
52 /\> cd
53 ~\> pushd ~root/Library
~root/Library ~
54 ~root/Library\> pushd /tmp
/tmp ~root/Library ~
55 /tmp\> popd
~root/Library ~
56 ~root/Library\> popd
~
57 ~\> pwd
/Local/Users/ocs
58 ~\> cd -
~root/Library
59 ~root/Library\> cd -
~
60 ~\>
Příkazem "cp" soubory kopírujeme. Příkaz může mít libovolný počet parametrů; poslední z nich musí být cílový adresář (nebo, pokud jsou parametry jen dva, jméno cílového souboru); všechny soubory odpovídající všem parametrům kromě prvého se zkopírují. Přepínač "-r" umožní kopírovat celé adresáře.
POZOR (nejen v příkazu "cp") na nutnost zadat cílový soubor nebo adresář! Pravidlo MS DOSu, kdy jej lze vynechat (a kopíruje se pak na běžný adresář) zde neplatí!
Přejmenovat soubor nebo adresář můžeme příkazem "mv". Tentýž příkaz dokáže přenést soubor nebo adresář na jiné místo na stejném disku (vlastně se stále jedná o přejmenování, ale jménem je v tomto kontextu celá cesta).
Zástupce ("link") vytvoříme příkazem "ln -s". Pokud bychom zapomněli na přepínač -s, vytvoří se tzv. hard link -- nové jméno téhož souboru (zástupce je naproti tomu samostatný soubor, obsahující odkaz na původní soubor). Hard link je po všech stránkách plně ekvivalentní původnímu jménu -- nejedná se tedy o zástupce; obě jména prostě sdílejí společný soubor.
Soubory můžeme rušit příkazem "rm". Přepínač -r umožní rušení celých adresářů. Pozor, příkaz "rm" soubory skutečně definitivně zruší; recyklovač se v tomto případě nepoužije.
69 ~\> ls [sf]*
sqlnet.log
70 ~\> mv sqlnet.log foobar
71 ~\> ls [sf]*
foobar
72 ~\> cp foobar sqlnet.log
73 ~\> ls [sf]*
foobar sqlnet.log
74 ~\> ln foobar foobar2
75 ~\> ls [sf]*
foobar foobar2 sqlnet.log
76 ~\> rm foo*
77 ~\> ls [sf]*
sqlnet.log
78 ~\>
Příkaz "cat" vypíše obsah souboru; totéž udělá příkaz "more", ten však výpis stránkuje, takže nám nic neuteče:

Nyní můžeme mezerníkem zobrazit další plné okno textu, klávesou Enter jen jediný další řádek, kombinací Control-C můžeme výpis přerušit (Control-C vůbec /skoro/ kdykoli přeruší /skoro/ jakýkoli běžící program) a otazníkem si můžeme vyžádat podrobnou nápovědu, popisující řadu dalších služeb příkazu "more".
Příkaz "su" umožní těm, kdo znají administrátorské heslo (a kdo jsou ve skupině "wheel") přepnout svůj terminál do administrátorského prostředí, a dělat v něm systémové zásahy:
107 /System/Library\> cd /Local/Applications
108 /Local/Applications\> mv BackupWizard.app BackupWizard.app.unused
mv: rename BackupWizard.app to BackupWizard.app.unused: Permission denied
109 /Local/Applications\> su
Password:
1 /Local/Applications# mv BackupWizard.app BackupWizard.app.unused
2 /Local/Applications# ls
.dir.jpeg GIFfun.app/ OpenBaseManager.app/
.dir5_0.wmd Internet/ OpenUp.app/
.opendir.jpeg JoyServices.app/ PackUpAndGo.app/
BackupWizard.app.unused/ Mesa3.app/ ReportMill.app/
ColdCompress.app/ ObjLicense.app/ Spectre.app/
Create.app/ ObjShell.app/
3 /Local/Applications# mv BackupWizard.app.unused BackupWizard.app
4 /Local/Applications# ^D
110 /Local/Applications\>
Administrátorský režim ukončíme stisknutím kombinace Ctrl-D. Povšimněme si také, jak inteligentní prompt shellu zsh indikuje administrátorský režim znakem '#'.
Řada příkazů shellu čte údaje z tzv. standardního vstupu a výsledky zapisuje na standardní výstup (patří mezi ně i příkazy "cat" a "more", pokud jsme jim neurčili jméno souboru, s nímž mají pracovat). Normálně oba dva odpovídají terminálovému oknu; můžeme je však přesměrovat:
Speciální znak ">" přesměruje standardní výstup do souboru. Chceme-li tedy třeba zapsat obsah běžného adresáře do souboru "dirlist", použijeme příkaz "ls > dirlist".
Speciální znak "<" přesměruje naopak standardní vstup ze souboru. Chceme-li si tedy např. prohlédnout obsah souboru "dirlist", použijeme příkaz "more < dirlist" (nebo "cat < dirlist"):
80 ~\> ls
Applications/ Library/ Projects/ Skoleni/
Information/ Mailboxes/ RootTemp@ sqlnet.log
81 ~\> ls > dirlist
82 ~\> more < dirlist
Applications/
Information/
Library/
Mailboxes/
Projects/
RootTemp@
Skoleni/
dirlist
sqlnet.log
83 ~\>
Za povšimnutí stojí jedna věc: příkaz "ls" bere v úvahu zda vypisuje údaje přímo do okna terminálu nebo jinam, a v prvém případě vypíše více složek nebo souborů na jeden řádek, ve druhém ne. To je proto, abychom mohli s výpisy souborů dále pohodlně pracovat; jednoduchý příklad si ukážeme za chvilku.
Speciální znak "|" přesměruje výstup jednoho programu na vstup dalšího. Spojený efekt obou minulých příkladů bychom tedy mohli zajistit příkazem "ls | more". Možností ale samozřejmě máme mnohem víc; jedním ze standardních programů unixu je "fgrep", který zobrazí jen ty řádky ze svého vstupu, jež obsahují zadaný text; kromě mnoha jiných věcí umí ignorovat velikost písmen, vyžádáme-li si to přepínačem "-i". Pokud bychom tedy chtěli zobrazit všechny složky, jež obsahují znaky "li" bez ohledu na velikost, mohli bychom použít třeba následující kombinaci příkazů (nikoli optimální):
83 ~\> ls | fgrep -i li | more
Applications/
Library/
dirlist
84 ~\>
Pro přesměrování existuje řada dalších služeb a triků. My si na našem omezeném prostoru ukážeme už jen jedinou: pokud namísto ">" použijeme ">>", zůstane původní obsah cílového souboru beze změny, a na jeho konec se navíc připojí standardní výstup.
NeXTStep obsahoval i nesmírně šikovné příkazy "copy" a "paste" pro práci se schránkou; v Mac OS X Serveru sice z mně naprosto nepochopitelných příčin nejsou, ale jejich varianty "xcopy" a "xpaste" jsou zdarma k dispozici od OCSoftware. Účelem těchto programů je zpřístupnit standardní schránku i terminálu: příkaz "xcopy" prostě uloží svůj standardní vstup do schránky; "xpaste" naopak opíše momentální obsah schránky na svůj standardní výstup.
Chceme-li tedy např. zahrnout do textu obsah některého adresáře, napíšeme v adresáři "ls | xcopy", a pak prostě v textovém editoru vyvoláme z menu příkaz "Paste". Naopak můžeme v libovolné aplikaci označit jakýkoli text, vyvolat příkaz "Copy", a text pak uložit do souboru v terminálu příkazem "xpaste > soubor". Na rozdíl od analogicky fungující služby TextEdit/Open Selection z menu Services, následované uložením souboru, je možné příkazy "xcopy" a "xpaste" snadno skládat do scriptů.
Pro přímou práci s defaults databází v Mac OS slouží příkaz "defaults". Ten má řadu podob a možných parametrů; my se zde seznámíme jen s jeho nejzákladnějším využitím: "defaults read <jméno aplikace> <jméno hodnoty>" zjistí hodnotu z defaults databáze, určenou oběma jmény; jméno "universální aplikace, platné pro všechny" je "NSGlobalDomain":
92 ~\> defaults read TextEdit NSColorPanelMode
6
93 ~\> defaults read Workspace AutoLaunchedApplication
(
/System/Applications/Clock.app,
/System/Demos/BackSpace.app,
/Local/Applications/Spectre.app
)
94 ~\> defaults read NSGlobalDomain NSPaperType
A4
95 ~\>
Druhý řádek, mimochodem, ilustruje to, že defaults databáze může uchovávat i složené objekty -- zde je to pole jmen všech aplikací, jež mají být spuštěny automaticky po startu aplikace Workspace Manager.
Příkaz"defaults write <jméno aplikace> <jméno hodnoty> <hodnota>" zapíše do databáze zadanou trojici; konečně "defaults delete <jméno aplikace> <jméno hodnoty>" z databáze určenou hodnotu odstraní:
97 ~\> defaults read TextEdit Foo
Sep 02 00:41:44 defaults[894]
The domain/default pair of (TextEdit, Foo) does not exist
98 ~\> defaults write TextEdit Foo Bar
99 ~\> defaults read TextEdit Foo
Bar
100 ~\> defaults delete TextEdit Foo
101 ~\> defaults read TextEdit Foo
Sep 02 00:42:40 defaults[901]
The domain/default pair of (TextEdit, Foo) does not exist
102 ~\>
Mimochodem, pokud bychom chtěli defaults databázi např. zálohovat, je to snadno možné -- je uložena ve složce "~/.OpenStep/UserDefaults2".
Nyní konečně můžeme splnit sliby z předcházejících kapitol, a naučit se určovat některé atributy Mac OS, jež z nepříliš jasných důvodů nelze specifikovat prostřednictvím GUI aplikací:
Chceme-li zajistit rozumné chování sliderů (viz popis v kapitole o ovladačích), zapíšeme prostě do defaults databáze
defaults write NSGlobalDomain NSScrollerPagingBehavior YES
Pro určení vlastních klávesových kombinací odpovídajících příkazům menu (viz kapitola o nabídkách) slouží default NSUserKeyEquivalents. Pro obecné položky menu (pokud bychom, řekněme, chtěli zajistit, aby se příkaz "Underline" vždy dal vyvolat kombinací Command-u) jej samozřejmě můžeme zapsat do NSGlobalDomain, častěji však asi budeme tento default využívat pro konkrétní aplikace. Následující příklad přiřadí příkazu "Delete Now" ve Workspace Manageru (a jenom tam) kombinaci Commad-r:
defaults write Viewer NSUserKeyEquivalents '{"Delete Now" = "@r"; }'(povšimněme si apostrofů, jež umožní vložit složitou hodnotu, obsahující i texy zapsané v uvozovkách).
Chceme-li přidat češtinu mezi standardní jazyky, podporované Mac OS, není nic jednoduššího -- prostě využijeme default "NSLanguages", třeba takto:
defaults write NSGlobalDomain NSLanguages '(Czech, English, French, German)'
Základním příkazem pro získání informací téměř o čemkoli je v unixu "man". Jeho parametrem je jméno objektu (nejčastěji, ale ne nutně, příkazu) který nás zajímá. Příkazem "man man" získáme informace o tom, jak man ovládat:

· Minulá kapitola · Obsah · Další kapitola
Copyright © OCSoftware, 2000; all right reserved