Obcování s ďáblem 10: Do fronty, pánové, do fronty! - 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:

Seriály

Více seriálů



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

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy a Triky  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

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

Uživatelské jméno:

Heslo: