procmailrc - konfigurační soubor programu procmail Chcete-li rychle začít, podívejte se na na konci manuálové stránky. Tento konfigurační soubor může obsahovat kombinaci přiřazení do proměnných prostředí (z nichž některé mohou mít pro procmail zvláštní význam), a předpisy. V nejjednodušší podobě obsahují předpisy jednořádkové regulární výrazy vyhledávané v hlavičce přijaté e-mailové zprávy. První předpis, který nalezne shodu s regulárním výrazem, potom určí kam se zpráva dále přesune (obvykle do souboru). Pokud se zpracování dostane až na konec rc souboru, procmail doručí e-mailovou zprávu na Existují dva druhy předpisů: doručující a nedoručující. Pokud je nalezena shoda v procmail považuje zprávu (ano, uhádli jste) za doručenou a konfiguračního souboru po úspěšném provedení akčního řádku předpisu. Pokud je nalezena shoda v zpracování bude i po provedení akčního řádku tohoto předpisu. Doručující předpisy jsou ty, které způsobí, že hlavičky a/nebo tělo zprávy jsou zapsány do souboru, použity nějakým programem nebo přesměrovány na nějakou poštovní adresu. Nedoručující předpisy jsou ty, které způsobí, že výstup nějakého programu nebo filtru je znovu zachycen procmail-em, nebo předpisy, které otevírají vnořený blok. Procmailu můžete říci, že má zpracovávat jako nedoručující, když uvedete příznak 'c' v hlavičce předpisu. To přinutí procmail vytvořit právě zpracovávané zprávy. Zpráva je tudíž doručena podle předpisu, ale zároveň se s její kopií pokračuje ve zpracování konfiguračního souboru. Použitím libovolného počtu předpisů můžete svou příchozí poštu velmi přímočarým způsobem roztřídit do několika složek. Avšak mějte na paměti, že do těchto složek mohou přicházet současně různé zprávy (jestliže běží více instancí procmailu, což není neobvyklé při větším množství došlých zpráv). Aby v tom případě ve složkách nevznikl zmatek, velmi doporučujeme vhodně používat zámků (angl. "lock files"). V konfiguračním souboru lze libovolně míchat do proměnných a Proměnné, které mají v procmailu zvláštní význam, budou použity příslušným způsobem v momentě zpracování řádku kde se vyskytují (tzn. že můžete kdykoliv změnit pracovní adresář zadáním nové hodnoty přepínat zámky přiřazením do kdykoliv změnit umask, atd., možností je nekonečně mnoho :-). Přiřazování a substituce těchto proměnných se provádí přesně stejně jako v (včetně všech možností uvozování a escape sekvencí), ale kromě toho ještě poskytuje další výhody v tom, že bílé znaky obklopující '=' jsou ignorovány. Pokud se objeví jméno proměnné bez koncového '=', bude tato proměnná zrušena. Jakýkoliv program uvedený ve zpětných apostrofech procmail spustí a předá mu celou zprávu na standardní vstup. Slovo začínající znakem # a všechny následující znaky až do konce řádku jsou ignorovány. Toto neplatí pro řádky obsahující podmínku, ty nemohou být komentovány. Řádek začínající znakem ':' označuje začátek předpisu. Má tento formát: 3 :0 [příznaky] [ : [lokální zámek] ] <jedna nebo více podmínek (jedna na řádek)> <právě jeden akční řádek> Podmínkový řádek začíná znakem `*'. Zbytek řádku kromě uvozujících a koncových mezer je poslán na vstup vnitřního egrep-u. Regulární výrazy vnitřního egrepu jsou kompatibilní s rozšířenou syntaxí regulárních výrazů programu Viz též Mezi podmínkami v jednom předpisu platí logický součin (AND). Pokud předpis neobsahuje žádnou podmínku, výsledek testu bude vždycky pravdivý. může být jeden z následujících znaků: Do programu egrep se pošle záhlaví zprávy (standard). Do egrepu se pošle tělo zprávy. Sdělí egrepu, že má rozlišovat malá a velká písmena (standard je nerozlišovat). Tento předpis bude závislý na posledním předcházejícím předpisu bez příznaku `A' nebo `a' (na aktuální úrovni vnoření). To vám umožňuje řetězit akce, které závisí na společné podmínce. Má tentýž význam jako `A', ale bude zároveň záviset na dokončení předchozího předpisu. Tento předpis se provede pouze v případě, že bezprostředně předcházející předpis nebyl proveden. Jeho úspěšné provedení rovněž znemožní provedení bezprostředně následujících předpisů s `E'. To vám umožňuje definovat akce typu `else if'. Předpis se provede pouze v případě, že bezprostředně předcházející předpis To vám umožňuje definovat akce na zpracování chyb. Záhlaví zprávy se pošle na vstup roury (default). Tělo zprávy se pošle na vstup roury (default). S rourou se má zacházet jako s filtrem. Vytvoř zpracovávané zprávy. Tento příznak má význam pouze v předpisech. Jediný druh nedoručujícího předpisu v němž dojde tento příznak smysluplného použití je blok (vnoření). Aby mohla být zpracována kopie, příznak způsobí právě běžícího procesu (zámky se nedědí), přičemž nový proces pokračuje ve zpracování obvyklým způsobem, zatímco původní proces přeskočí blok a pokračuje za ním. Čeká na ukončení spuštěného filtru nebo programu a otestuje návratovou hodnotu (standardně jí ignoruje). Pokud bude filtr neúspěšný, text nebude filtrován. Stejný význam jako příznak `w', ale potlačí hlášky `Program failure'. Ignoruje chyby zápisu v tomto předpisu (obvykle nastávají při předčasném uzavření roury). `Hrubý' režim (raw). Nepokouší se ujistit jestli zpráva končí prázdným řádkem, zapíše ji tak jak je. Můžete použít zvláštní podmínky, které nejsou přímo regulárními výrazy. Takové podmínky musí začínat: Negace podmínky následující po vykřičníku. Zbytek vyhodnotí podle pravidel pro substituci uvnitř dvojitých uvozovek v , přeskočí úvodní mezery a potom znovu vyhodnotí Použije exit kód uvedeného programu Otestuje zda je celková délka zprávy menší než uvedený počet bajtů (decimálně). Obdobně jako '<'. Porovná zbytek s hodnotou této proměnné (nesmí se jednat o pseudoproměnnou). Zvláštním případem jsou `B', `H', `HB' a `BH', které pouze mění prohledávanou oblast záhlaví/těla zprávy, definovanou pro aktuální předpis. Použijte, chcete-li použít kterýkoliv z výše uvedených znaků na začátku řádku v jeho normálním významu. Pokud umístíte na konec prvního řádku předpisu druhou dvojtečku, procmail použije (pouze pro aktuální předpis). Volitelně můžete za dvojtečku zadat jméno zámku, který chcete použít. Pokud tak ovšem neučiníte, procmail použije jméno výstupního souboru (nebo jméno za první '>>'), za které připojí hodnotu $LOCKEXT. Akční řádek může začínat jedním z následujících znaků: Pošle poštu (forward) na všechny následující e-mailové adresy. Spustí program; pokud je nalezen kterýkoliv znak z $SHELLMETAS, pokusí se spustit program pomocí $SHELL-u. Volitelně můžete před znak roury umístit což způsobí, že standardní výstup spuštěného programu bude uložen do Pokud zadáte pouze znak roury bez žádného názvu programu, procmail přesměruje obsah zprávy na standardní výstup. Následována alespoň jednou mezerou, tabulátorem nebo znakem nový řádek označuje začátek vnořeného bloku. Všechno uvnitř bloku až po následující uzavírající závorku bude záviset na podmínce aktuálního předpisu. Počet úrovní vnoření není omezen. Uzavírací závorka pouze ukončuje blok; v nezpůsobuje ukončení procmailu. Když je dosaženo konce bloku, zpracování pokračuje obvyklým způsobem za blokem. Ve vnořeném bloku mají příznaky `B' a `H' vliv pouze na podmínky předcházející tento blok, příznaky `h' a `b' nemají vůbec žádný vliv. Cokoliv jiného bude považováno za jméno poštovní schránky (buď jméno souboru nebo adresáře, absolutní nebo relativní k aktuálnímu adresáři (viz MAILDIR)). Pokud se jedná o jméno souboru (byť neexistujícího), zpráva bude přidána na jeho konec. Pokud se jedná o jméno adresáře, zpráva bude doručena do souboru se zaručeně jedinečným názvem začínajícím $MSGPREFIX, nově vytvořeného v tomto adresáři. Pokud název adresáře končí řetězcem "/.", předpokládá se, že se jedná o složku systému MH a procmail použije další volné číslo, které nalezne. Pokud procmail doručuje do adresáře, můžete zadat několik adresářů do nichž chcete zprávu doručit. Vaše (příjemcovy) standardní hodnoty & 'u' |<>~;?*[ -c /var/spool/mail/$LOGNAME
(V případě, že bylo zadáno -m nedefinováno) $HOME/
(Kromě případu, kdy jméno prvního úspěšně otevřeného rc souboru začíná `./'; tehdy je implicitní hodnota `.') $ORGMAIL msg. /usr/sbin/sendmail Aktuální jméno počítače (hostname) no
(Pokud je jméno rc souboru uvedeno v příkazové řádce) .lock Ostatní nulované nebo přednastavené proměnné jsou IFS, ENV, PWD, PATH=$HOME/bin 'u' :/bin 'u' :/usr/bin 'u' :/sbin 'u' :/usr/sbin 'u' :/usr/local/bin 'u' :/usr/local/sbin 'u' :/usr/bin/X11 a USER=$LOGNAME. Dříve než vás zahltí množství proměnných, mějte na paměti, že všechny mají rozumné implicitní hodnoty. Aktuální adresář za běhu procmailu (což znamená, že všechny cesty jsou relativní vzhledem k $MAILDIR). Standardní soubor (pokud není určeno jinak, procmail uloží zprávu do této schránky). Před zápisem do této schránky použije procmail automaticky $DEFAULT$LOCKEXT jako zámek. Tuto proměnnou nemusíte nastavovat, neboť již obsahuje implicitní systémovou schránku. Tento soubor bude obsahovat jakákoliv chybová nebo diagnostická hlášení procmailu (za normálních okolností žádná :-) příp. jiných programů spuštěných procmailem. Jestliže tento soubor není definován, veškerá diagnostická nebo chybová hlášení budou zaslána e-mailem odesilateli zprávy. Viz též Nastavením této proměnné na `yes' nebo `on' (ano, resp. zapnout; pozn. překl.) případně `no' či `off' (ne, vypnout) můžete zapínat respektive vypínat Těsně před svým ukončením zapíše procmail do souboru $LOGFILE shrnutí zprávy: záhlaví `From:' a `Subject:', do jaké složky (schránky) byla zpráva uložena a jaká byla její délka v bajtech. Nastavením této proměnné na `no' se výpis potlačí. Nastavením této proměnné na `all' (všechno) se zajistí výpis pro každý úspěšně dokončený Cokoliv přiřazené této proměnné bude připojeno do souboru $LOGFILE. Obvykle systémová schránka (ORiGinal MAILbox). Pokud z nějakého tajemného důvodu nemůže být zpráva doručena, tato schránka bude poslední možností. Pokud se procmailu nepodaří zprávu uložit ani sem (móc, moc špatný :-) vrátí zprávu odesílateli. Globální semafor. Pokud tento soubor již existuje, procmail před dalším zpracováním počká až zmizí; potom jej sám vytvoří (a samozřejmě také smaže, když skončí). Pokud je specifikován více než jeden bude ten předchozí smazán dříve než se zkusí vytvořit nový. Užívání globálního semaforu se nedoporučuje. Tam kde je to možné, použijte místo toho lokální zámky (na bázi jednotlivých předpisů). Implicitní přípona, jejímž připojením ke jménu cílového souboru se získá jméno (pokud jsou zapnuty, pro jednotlivé předpisy). Počet sekund, které procmail vyčká než opět zkusí (pokud již existoval); pokud není specifikováno, implicitní hodnota je 8 sekund. Počet sekund, které musí uplynout od času poslední modifikace/vytvoření aby procmail usoudil, že se to musí být soubor pozůstalý v důsledku chyby, který nyní může být nuceně odstraněn. Pokud je nastavena nula, lhůta se nepoužije a procmail bude čekat navždy dokud se soubor neodstraní; pokud není specifikována žádná hodnota, implicitně 1024 sekund. Tato proměnná se hodí proti zacyklení Procmail je imunní vůči odchylkám hodin na různých počítačích. Počet sekund, které musí uplynout než procmail usoudí, že některý z dceřiných procesů, které spustil, musel zamrznout. Dotyčný program obdrží od procmailu signál TERMINATE a zpracování konfiguračního souboru bude pokračovat. Pokud je nula, lhůta se nepoužije a procmail čeká dokud se neukončí dceřiný process; není-li hodnota specifikována je implicitní hodnota 960 sekund. Předpona souboru, pokud se zpráva doručuje do adresáře (nepoužívá se při doručování do MH adresáře). Pokud toto není totožné se jménem počítače, které vrací zpracování aktuálního se okamžitě ukončí. Pokud byly na příkazové řádce uvedeny další soubory, zpracování bude pokračovat následujícím z nich. Pokud již byly všechny použity, program se ukončí, ale nezpůsobí chybu (tzn. že poštovnímu programu se bude zdát, že pošta byla doručena). Jméno říká vše (pokud ne, zapomeňte na něj :-). Jakákoliv hodnota přiřazená UMASK bude interpretována jako číslo. Není-li specifikováno, maska je implicitně 0777. Pokud maska dovoluje o+x, všechny schránky do nichž procmail doručuje přímo prodělají změnu o+x. To se dá použít ke kontrole zda přišla nová pošta. Pokud se kterýkoliv ze znaků řetězce SHELLMETAS objeví v řádku obsahujícím filtr nebo program, řádek bude poslán do $SHELL namísto přímého spuštění. Jakékoliv volání $SHELL-u bude uskutečněno ve tvaru
"$SHELL" "$SHELLFLAGS" "$*"; Pokud nepoužíváte nelamte si s tímhle hlavu. Určuje program, který bude forwardovat jakoukoliv poštu.
Volá se jako: "$SENDMAIL" "$@"; Počet opakovaných pokusů před tím než nastane některá z chyb `process table full' (zaplnění tabulky procesů), `file table full' (zaplnění tabulky souborů), `out of memory' (nedostatek paměti) nebo `out of swap space' (zaplnění odkládacího prostoru). Pokud je toto číslo záporné, procmail to bude zkoušet donekonečna; pokud není specifikováno, implicitní hodnota je 4. Další pokusy o opakování akce nastávají v intervalu $SUSPEND sekund. Myšlenka tohoto uspořádání spočívá v tom, že pokud je např. vyčerpán nebo se zaplnila obvykle to zjistí několik dalších programů, které buď skončí nebo zkolabují čímž uvolní nedostávající se systémové procmailu. Čas v sekundách kdy bude procmail čekat na něco co momentálně není k dispozici (paměť, fork, atd.); není-li specifikováno, implicitní hodnota je 16 sekund. Viz též: Délka interní řádkové vyrovnávací paměti. Nelze nastavit menší než 128. Délka žádného řádku v by neměla překročit $LINEBUF znaků před ani po provedení substitucí. Pokud není specifikováno, standard je 2048. Toto omezení samozřejmě na zprávu samotnou; ta může mít libovolné délky řádků nebo může být i binárním souborem. Pokud je nastavena na `yes', procmail bude předstírat (MTA), že zpráva byla doručena. Pokud při takovém nastavení nelze zprávu doručit, zpráva bude navždy ztracena (nebude odeslána na postmastera apod.). Při ukončení procmailu se provede obsah této proměnné. Kopie zprávy je k dispozici na standardním vstupu. Jakýkoliv výstup vytvořený tímto příkazem bude připojen do souboru $LOGFILE. Možná použití TRAP-u: odstranění dočasných souborů, na míru šité výtahy zpráv, atd. Viz též: a Pokud byla této proměnné přiřazena kladná hodnota, použije se jako návratová hodnota při ukončení procmailu. Pokud je tato proměnná specifikována, ale prázdná, procmail použije návratovou hodnotu vrácenou programem Pokud tato proměnná není nastavena, procmail ji nastaví krátce před vyvoláním programu Tuto proměnnou nastaví procmail kdykoliv doručí nějakou zprávu do složky nebo do programu. Vždy obsahuje jméno složky (nebo programu) kam procmail doručil zprávu. Procmail přiřadí této proměnné hodnotu kdykoliv má uložit text z úspěšně porovnaného regulárního výrazu. Obsahuje veškerý text vyhovující regulárnímu výrazu za speciálním znakem `\/'. Přiřazení kladné hodnoty této proměnné má stejný efekt jako příkaz `shift' v Tento příkaz má největší využití při získání dalších argumentů předaných procmailu když je použit jako generický filtr e-mailových zpráv. Jméno konfiguračního souboru (relativní vzhledem k aktuálnímu adresáři), který bude zařazen do zpracování jako by byl součástí aktuálního konfiguračního souboru. Je povoleno neomezené vnořování. Implicitně je notifikace zapnutá. Dá se vypnout nastavením této proměnné na `no'. Alternativně lze službu biff upravit nastavením této proměnné buď na `služba@', `@hostname', nebo `služba@hostname'. Není-li specifikováno, použije se biff@localhost. Nastaví-li se na `yes', procmail `shodí' všechna práva, kterých eventuálně mohl nabýt (suid, sgid). Toto se hodí pouze v případě, že chcete, aby se zbylá část souboru /etc/procmailrc provedla jménem příjemce. Následující speciální konstrukce používá jak interní egrep v procmailu, tak standardní Začátek řádku. Konec řádku. Jakýkoliv znak kromě konce řádku. Posloupnost libovolného, i nulového počtu áček. Posloupnost jednoho nebo více áček. Jedno nebo žádné a. Jakýkoliv znak, který pomlčka, a, b, c, d nebo konec řádku. Buď posloupnost `de' nebo `abc'. Žádný výskyt nebo libovolný počet opakování posloupnosti `abc'. Tohle byly samozřejmě pouze příklady. Jakákoliv složitější kombinace je rovněž přípustná. Následující speciální konstrukce používá procmail jako rozšíření: ^ nebo $ Odpovídá novému řádku (u víceřádkových porovnání). Zakotví výraz na úplném začátku porovnávané oblasti, resp. na jejím úplném konci je-li tato kombinace nalezena na konci výrazu. \< nebo \> Porovnání se shoduje se znakem před anebo za slovem. Tyto speciální výrazy jsou pouhým synonymem pro `[^a-zA-Z0-9_]', ale shoda nastane i pro znak `nový řádek'. Jelikož tyto symboly se shodují se skutečnými znaky, lze je použít pouze k oddělení slov, nikoli pro odlišení mezer mezi slovy. Rozděluje výraz na dvě části. Všechno co se shoduje v pravé části se přiřadí proměnné MATCH. Viz manuálová stránka Akční řádek, který pokračuje na dalším řádku musí vždycky končit obráceným lomítkem, dokonce ani kdyby spouštěný shell nepotřeboval nebo nechtěl, aby obrácené lomítko takový řádek označovalo. Důvod spočívá v dvoufázovém procesu analýzy řádku (nejdřív procmail, potom shell (nebo také ne, v závislosti na Nedávejte na podmínkové řádky s regulárními výrazy žádné komentáře, protože celý řádek je předán internímu egrepu (kromě pokračovacích obrácených lomítek na konci řádku). Úvodní mezera na řádku na němž pokračuje regulární výraz je obvykle ignorována (takže můžete pokračování odsadit), ale na pokračovacích řádcích, na nichž jsou prováděny substituce podle pravidel pro substituce uvnitř dvojitých závorek Dávejte si pozor na zacyklení při provádění nezdravých věcí, jako třeba odeslání zprávy (forward) na svůj vlastní účet. Zacyklení může být přerušeno správným použitím Jakékoliv implicitní (standardní) hodnoty, které má procmail pro některé proměnné přepíší už definované hodnoty. Pokud chcete implicitní hodnoty s jistotou změnit, musíte nové hodnoty definovat v nebo jako parametr na příkazovém řádku. Proměnné nastavené akce typu `|' spouštěné shellem si své hodnoty po ukončení předpisu jelikož jsou nastaveny v podřízeném shellu spuštěném procmailem. Chcete-li mít jistotu, že si proměnná podrží svou hodnotu,, musíte provést přiřazení ještě před uvozujícím `|' předpisu. Pokud definujete v doručujícím předpisu příznak `h' nebo `b' a dojde ke shodě podmínky, pak, pokud jste nedefinovali zároveň příznak `c', tělo zprávy resp. záhlaví bude bez varování ztraceno. Procmail je schopen sám o sobě provádět substituce proměnných pouze tohoto typu: $jméno, ${jméno}, ${jméno:-text}, ${jméno:+text}, ${jméno-text}, ${jméno+text}, $#, $n, $$, $?, $_, $- a $=; přičemž za $_ bude dosazeno jméno aktuálního konfiguračního souboru, za $- $LASTFOLDER a $= bude obsahovat výsledek posledního předpisu. Když jsou použity volby nebo za "$@" se dosadí příslušný parametr (resp. seznam). Ovšem pouze je-li předáván v seznamu parametrů nějakému programu. Procmail nepodporuje substituci `~'. Při zpracovávání se používá řádková vyrovnávací paměť (řádkový buffer) o délce $LINEBUF. Jakékoliv rozšíření zpracovávaného řádku při substitucích se vejít do tohoto limitu; pokud ne, dojde k nedefinovanému chování programu. Pokud má globální semafor (zámek) relativní cestu, a aktuální adresář není ten v němž byl semafor vytvořen, potom semafor nebude odstraněn pokud procmail v tomto místě skončí (řešení: pro globální semafor používejte cestu). Lokální semafor v předpisu, který otevírá vnořený blok nebude fungovat tak jak čekáte. Při uložení obsahu standardního výstupu do proměnné bude odstraněn právě jeden koncový znak `nový řádek'. Pokud regulární výraz obsahuje `^TO', bude tento řetězec nahrazen výrazem `(^((Original-)?(Resent-)?(To 'u' |Cc 'u' |Bcc) 'u' |(X-Envelope 'u' |Apparently(-Resent)?)-To) 'u' :(.*[^a-zA-Z])?)', což by mělo zachytit všechny možné specifikace adresáta. Pokud regulární výraz obsahuje `^FROM_DAEMON', bude to nahrazeno výrazem `(^(Precedence 'u' :.*(junk 'u' |bulk 'u' |list) 'u' |(((Resent-)?(From 'u' |Sender) 'u' |X-Envelope-From) 'u' : 'u' |>?From )(.*[^(.%@a-z0-9])?(Post(ma?(st(e?r)? 'u' |n) 'u' |office) 'u' |(send)?Mail(er)? 'u' |daemon 'u' |mmdf 'u' |root 'u' |n?uucp 'u' |smtp 'u' |response 'u' |LISTSERV 'u' |owner 'u' |request 'u' |bounce 'u' |serv(ices? 'u' |er) 'u' |Admin(istrator)?)([^).! 'u' :a-z0-9].*)?$[^>]))', což by mělo zachytit zprávy odeslané většinou démonů. Pokud regulární výraz obsahuje `^FROM_MAILER', bude to nahrazeno výrazem `(^(((Resent-)?(From 'u' |Sender) 'u' |X-Envelope-From) 'u' : 'u' |>?From )(.*[^(.%@a-z0-9])?(Post(ma(st(er)? 'u' |n) 'u' |office) 'u' |(send)?Mail(er)? 'u' |daemon 'u' |mmdf 'u' |root 'u' |n?uucp 'u' |smtp 'u' |response 'u' |serv(ices? 'u' |er) 'u' |Admin(istrator)?)([^).! 'u' :a-z0-9].*)?$[^>])' (ořezaná verze `^FROM_DAEMON'), což by mělo zachytit zprávy od většiny poštovních démonů. Pro přiřazení logických hodnot proměnným jako VERBOSE, DELIVERED nebo COMSAT procmail akceptuje jako logickou jedničku jakýkoliv řetězec, který začíná: nenulovou hodnotou, slovem `on', `y', `t' nebo `e'. Nepravda (logická 0) je jakýkoliv řetězec začínající nulovou hodnotou, `off', `n', `f' nebo `d'. Pokud akční řádek předpisu specifikuje program, pak řádek skládající se z pouhé dvojice zpětné lomítko-nový řádek na jinak prázdném řádku bude převeden na znak nový řádek. Jelikož v konfiguračním souboru se všeobecně ignorují úvodní bílé znaky bez uvozovek, můžete je využít zcela dle své chuti k odsazování textu. Úvodní `|' na začátku akčního řádku, které specifikuje program nebo filtr se odřeže ještě před testováním řádku na přítomnost SHELLMETAS. Soubory zahrnuté direktivou INCLUDERC a obsahující pouze přiřazení do proměnných mohou být sdíleny s sh. Chcete-li komplikované zpracování, můžete zvážit dokonce rekurzivní volání Stephen R. van den Berg, RWTH-Aachen, Germany berg@pool.informatik.rwth-aachen.de