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 10: Do fronty, pánové, do fronty!
27. září 2001, 00.00 | Minule jsme se naučili spouštět více programů zároveň. Dnes si řekneme, jak si vyžádat postupné spuštění více programů, tak, aby byl další spuštěn, když ten předchozí skončí.
Obcování s ďáblem 10: Do fronty, pánové, do fronty!Minule jsme se naučili spouštět více programů zároveň. Někdy se nám ale hodí jiná věc: vyžádat si naopak postupné spuštění více programů, tak, aby byl další spuštěn, když ten předchozí skončí. Vzpomeňme si třeba na náš příklad ze čtvrtého dílu, kdy jsme přeložili program v jazyce C a pak jsme jej spustili pomocí příkazů
293 /tmp> cc test.C 294 /tmp> ./a.out /etc/*.conf
Bylo by jistě pohodlnější říct rovnou shellu "až skončíš s překladem, spusť výsledek". Skutečně to možné je, a shell k tomu používá středník:
86 /tmp> cc test.C ; ./a.out /etc/*.conf arg 1 -> /etc/bootstrap.conf arg 2 -> /etc/kern_loader.conf arg 3 -> /etc/krb.conf arg 4 -> /etc/krb5.conf 87 /tmp>
Takto můžeme pomocí středníků seřadit "za sebe" libovolně mnoho příkazů.
Ovšem, zkušenější programátoři namítnou, že tento postup má jednu závažnou chybu: co když se překlad nepodaří? Tvůrce shellu to napadlo také, a proto máme k dispozici kromě středníku další oddělovač — dvojitý ampersand. Na první pohled slouží podobně jako středník — spojí dohromady dva příkazy, z nichž druhý se spustí poté, co první skončí. Zásadní rozdíl ovšem je v tom, že u ampersandů shell nejprve ověří, zda první příkaz skončil bez chyby, a pouze v takovém případě spustí druhý:
cc test.C && ./a.out /etc/*.conf
Tento příkaz funguje přesně stejně jako minulý, pokud se překlad podaří bez chyby. Jestliže však při překladu dojde k chybě, program a.out se nespustí.
(Pro ty, koho zajímá, jak se shell dozví, zda program skončil s chybou nebo ne: každý program vrací číselnou hodnotu, tzv. "exit status" — programátoři to dobře vědí. Shell tuto hodnotu zná, a podle ní se zařídí: platí konvence, že nulový status znamená "vše v pořádku". Programátoři ostatně také poznají ty dva ampersandy; je to vlastně operátor 'logické AND' z jazyka C, který se chová velmi podobně: je-li výraz před ním "pravdivý", vyhodnotí se i výraz za ním; je-li výraz před ním "nepravdivý", výraz za ním se ignoruje.)
Stejně jako středníky, můžeme i ampersandy použít vícekrát v jediném příkazu pro spojení více než dvou programů. V takovém případě můžeme používat i závorky, v přirozeném smyslu určujícím, co se má stát dříve a co potom. Mohli bychom třeba chtít výsledek překladu vyzkoušet a hned smazat; to by vypadalo takto:
cc test.C && ( ./a.out /etc/*.conf ; rm a.out )
Úplně nakonec kratičká poznámka pro šťouraly, kteří by chtěli analogii ampersandů s Céčkovým operátorem "and" dovést do důsledků: ano, shell skutečně podporuje i "svislítka", tj. oddělovač příkazů "||". Jeho význam opět odpovídá logice operátoru 'logické OR' z jazyka C — pokud první příkaz skončí chybou, druhý se provede; skončí-li však první z příkazů bez chyby, druhý se přeskočí.
Vzhledem k tomu, že např. příkaz grep, který známe ze sedmého dílu, skončí "s chybou" pokud nic nenašel, ale "bez chyby", nalezl-li alespoň jeden výskyt zadaného textu, můžeme použít následující jednoduchý příkaz
grep text nejradsi_tyhle || grep text nebo_aspon_tyhle
pro následující, poměrně složitou logiku: Prohledej soubory "nejradsi_tyhle" a ukaž mi všechny výskyty zadaného textu. Kdyby tam ale nebyl žádný, prohledej také "nebo_aspon_tyhle".
Ukážeme si na rozloučenou takový příklad, který hledá požadovaný text postupně v několika hrách Williama Shakespeara (a zobrazí jen tu prvou, ve které jej najde); zároveň použijeme proměnné shellu, se kterými jsme se seznámili v osmém dílu v souvislosti s proměnnou PATH (nezapomeňte, že s proměnnými se v různých shellech pracuje malinko jinak, a že my zde používáme zsh):
107 Literature/Shakespeare/Plays> X="rose" ; grep $X Hamlet/* || grep $X Romeo_and_Juliet/* || grep $X Othello/* || grep $X Macbeth/*
Hamlet/1.3: Himself the primrose path of dalliance treads
Hamlet/3.1: Th'expectancy and rose of the fair state,
Hamlet/3.2: roses on my razed shoes, get me a fellowship in a cry
Hamlet/3.4: Calls virtue hypocrite, takes off the rose
Hamlet/4.5: Then up he rose, and donned his clothes,
Hamlet/4.5: Till our scale turns the beam. O rose of May,
Hamlet/4.5: There's rosemary, that's for remembrance. Pray,
108 Literature/Shakespeare/Plays> X="call a rose" ; grep $X Hamlet/* || grep $X Romeo_and_Juliet/* || grep $X Othello/* || grep $X Macbeth/*
Romeo_and_Juliet/2.1: What's in a name? That which we call a rose
109 Literature/Shakespeare/Plays> X="candle" ; grep $X Hamlet/* || grep $X Romeo_and_Juliet/* || grep $X Othello/* || grep $X Macbeth/*
Romeo_and_Juliet/1.4: I'll be a candle-holder and look on.
Romeo_and_Juliet/3.5: Night's candles are burnt out, and jocund day
110 Literature/Shakespeare/Plays> X="brief candle" ; grep $X Hamlet/* || grep $X Romeo_and_Juliet/* || grep $X Othello/* || grep $X Macbeth/*
Macbeth/5.5: The way to dusty death. Out, out, brief candle.
111 Literature/Shakespeare/Plays>
Můžete se těšit na příště — pustíme se do jedné z nejsilnějších "zbraní" shellu, právě do toho, co umožňuje shellovým programům tak dobře spolupracovat, že z nich často dokážeme sestavit v jediném příkazu služby, na které bychom jinak potřebovali specializovanou aplikaci: budeme se zabývat standardním vstupem a výstupem.
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á