Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Obcování s ďáblem 11: Standardní vstup a výstup
4. října 2001, 00.00 | V rozumném prostředí musí existovat způsob, jak mohou programy vzájemně spolupracovat. Dneska si vysvětlíme, jak pro komunikaci programů mezi sebou použivat standardní vstup a výstup
V rozumném prostředí musí existovat způsob, jak mohou programy vzájemně spolupracovat. Pokud tomu tak není, skončíme s několika mamutími aplikacemi, z nichž každá dělá všechno — od práce se soubory přes editaci textu až po spreadsheet — a dohromady to nestojí za nic; ti, kdo znají MS DOS (a MS Windows), vědí, o čem mluvím.Unix naštěstí podporuje právě opačný přístup: každý jeho program dělá jen jednu jedinou věc, zato ji ale umí perfektně. Potřebujeme-li nějakou kombinovanou akci, použijeme více programů najednou. Pro jejich spolupráci se v unixu používá právě standardní vstup a výstup.
O co vlastně jde?
Základní myšlenka je nesmírně jednoduchá: na první pohled se zdá, že každý program načítá vstupní informace prostřednictvím terminálového okna z klávesnice, a zapisuje výsledky své práce zpět do téhož okna. Není to tak úplně pravda: unixové programy jsou zásadně psány tak, že používají abstraktní vstup a abstraktní výstup; teprve při spouštění programu se určí, co bude ve skutečnosti jeho vstupem, a kam půjde jeho výstup.
Tak je třeba rozumět pojmům "standardní" vstup a výstup: program nenačítá vstupní data z klávesnice, ale ze svého standardního vstupu — ať již jde ve skutečnosti o klávesnici, soubor, nebo kdovíco jiného. Podobně data, zapsaná na standardní výstup mohou stejně dobře skončit v obrazovkovém okně jako třeba v souboru nebo odeslána po sériovém rozhraní.
Díky tomu můžeme říci programu, aby pro vstup použil data, uložená v některém souboru. Nebo aby naopak svůj výstup do souboru uložil. Nebo aby přímo zpracoval výstup jiného programu. Nebo aby výstup předal shellu, který už si s ním nějak poradí... postupně si tyto možnosti ukážeme.
Standardní výstup
Asi nejjednodušší je prosté přesměrování výstupu do souboru. Zapíšeme-li na příkazový řádek většítko a za něj jméno souboru, nebude se výstup příkazu zobrazovat v okně, ale uloží se do zadaného souboru (připomeňme, že příkaz cat zobrazí obsah souboru):
1 ~> ls /Applications > /tmp/apps
2 ~> cat /tmp/apps
Address Book.app/
AppleScript/
Calculator.app/
Chess.app/
Clock.app/
Dock Extras/
Image Capture.app/
Internet Connect.app/
Internet Explorer/
Mail.app/
OmniWeb.app/
Preview.app/
QuickTime Player.app/
Sherlock.app/
Stickies.app/
System Preferences.app/
TextEdit.app/
Utilities/
iMovie for Mac OS X/
iTunes for Mac OS X/
3 ~>
Už sama tato služba je docela šikovná, protože nám umožňuje výstup kteréhokoli příkazu uložit do souboru. Připomeňme např. poslední příklad minule, kdy jsme hledali a nacházeli různé citáty z Shakespeara — mít takové výsledky v souboru se může hodit...
Takto uložená data však můžeme také použít pro další zpracování. Vzpomeňte si na příkaz grep; pokud bychom chtěli zjistit, které aplikace mají ve svém jméně "net", můžeme použít třeba následující příkaz:
10 ~> grep net /tmp/apps
Internet Connect.app/
Internet Explorer/
11 ~>
(Říkáte, že jsme stejně dobře mohli použít rovnou "ls -d /Applications/*net*"? Ale ovšem! Zatím si přeci ukazujeme jen jednoduché příklady; kromě toho, grep toho dokáže mnohem více, než ls, jen jsme si dosud jeho plnou sílu neukázali.)
Standardní vstup
Naprostá většina příkazů, které načítají data z nějakého souboru, dokáže stejně dobře pracovat se standardním vstupem; obvykle používají jednoduchou logiku "není-li zadán vstupní soubor, načtu místo něj standardní vstup". Díky tomu můžeme např. příkaz cat použít jako trivální editor: víme o něm, že zobrazí obsah zadaného souboru; teď také víme, že pokud žádný soubor nezadáme, bude načítat standardní vstup. Pokud tedy nezadáme žádný vstupní soubor, ale přesměrujeme výstup do požadovaného cílového souboru, můžeme pomocí standardního vstupu (neřekneme-li jinak, je jím klávesnice) přímo zapsat jeho požadovaný obsah:
13 ~> cat > /tmp/nic
Tento text bude obsahem souboru /tmp/nic._
Zapisování textu na standardní vstup ukončíme kombinací Control-D (zadanou na začátku nového řádku), jak už víme z odstavce o shellech v osmém dílu. Hned si můžeme zkontrolovat — již známým použitím příkazu cat — zda se to podařilo:
14 ~> cat /tmp/nic
Tento text bude obsahem souboru /tmp/nic.
15 ~>
Porovnejte znovu na první pohled velmi podobné příkazy z řádků 13 a 14! Je opravdu jasné, v čem je mezi nimi rozdíl? Pokud ne, napište mi, a příště se na to podíváme podrobněji...
Chceme-li do standardního vstupu přesměrovat obsah nějakého souboru, použijeme menšítko a jméno souboru. Vyhledání aplikací obsahujících "net" z řádku 10 bychom tedy stejně dobře mohli přepsat takto:
15 ~> grep net < /tmp/apps
Internet Connect.app/
Internet Explorer/
16 ~>
Zde grep nedostal žádný vstupní soubor; proto načítá standardní vstup (do kterého jsme přesměrovali obsah souboru "/tmp/apps"), a vybírá řádky, obsahující zadaný text, z něj.
A ještě jednou výstup
Shell nabízí další šikovnou fintu: pokud napíšeme většítka dvě, dokáže přidávat nový text na konec již existujícího souboru (nový soubor tedy vytvoří jen tehdy, když soubor daného jména neexistuje):
25 /tmp> ls neco
ls: neco: No such file or directory
26 /tmp> date >> neco
27 /tmp> cat nic >> neco
28 /tmp> cat neco
Mon Aug 27 19:58:27 CEST 2001
Tento text bude obsahem souboru /tmp/nic.
29 /tmp>
A to je všechno?
Už tyto minimální služby by nám umožnily docela slušně kombinovat služby různých aplikací; to pravé kouzlo práce se standardním vstupem a výstupem však přinese až přímé přesměrování výstupu jednoho programu na vstup dalšího, a předání standardního výstupu přímo shellu do příkazové řádky. To si však už necháme na příště.
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová
Tématické zařazení:
» Rubriky » Začínáme s