Obcování s ďáblem 11: Standardní vstup a výstup - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Jaký fotograf/ka získal/a cenu za nejpopulárnější příspěvek v Nikon Photo Contest?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



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):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: