Finty v Shellu

Petr Mareš

V minulém seriálu o AmigaDOSu jste se dozvěděli něco o standardních příkazech a o tom, jak psát scripty. Tento článek by vám měl tuto práci zpříjemnit a dát vám rady, jak si můžete nakonfigurovat systém dle libostí.

Začneme třeba jednoduchým scriptem, který nahradí nepříjemné cestování mezi adresáři pomocí DIR a CD něčím pohodlnějším:

CD RequestFile DRAWERSONLY TITLE „Change Directory“

Tento jednořádkový script si uložte do adresáře S: třeba jako „cdr“ a nastavte mu pomocí příkazu „Protect S:cdr s ADD“ flag S, aby systém věděl, že ho má spouštět užitím příkazu EXECUTE. Nyní stačí napsat „cdr“ a v ASL requesteru si vybrat nový aktuální adresář (dokonce funguje i vhození ikony adresáře do ASL okna).
Podobná finta s FileRequesterem se nám může hodit i jindy. Pokud například kopírujeme soubory s dlouhými názvy, je snadnější napsat

Copy RequestFile DF0:

a soubor k zápisu na disketu si vybrat myší. Ne každému se ale chce vždy vypisovat celé „RequestFile“ a proto je lepší přidat do souboru S:Shell-Startup řádek

Alias rf RequestFile

který způsobí, že místo „RequestFile“ stačí napsat jenom „rf“. Osobně bych doporučoval si v S:Shell-Startup změnit standardní PROMPT na

Prompt „[%R] %S> “

což způsobí, že prompt bude vypisovat v hranatých závorkách návratový kód posledního spouštěného programu. Tím bych rád příkazový řádek opustil a věnoval bych se spíše scriptům a jmenovitě fintám, které z dávkových souborů dělají nástroj nadmíru užitečný. Některé z uvedených triků budou trochu nečisté, nicméně perfektně funkční. Můžeme začít třeba čtením řetězce z klávesnice. AmigaDOS na první pohled nemá příkaz pro čtení ze vstupu, ale my si už nějak vypomůžeme. Uvedu příklad, který načte z klávesnice jméno souboru a ten poté bude hledat v adresáři SYS: (disk, ze kterého se bootovalo):

Echo „Zadej soubor: “ NOLINE
Set >NIL: Vstup ?
Echo „Prohledávám SYS:“
Search SYS: „$Vstup“ FILE ALL
IF WARN
Echo „Nic jsem nenašel.“
EndIF

Za pozornost stojí hlavně druhý řádek. Příkazu „Set“ jsme zadali neúplné argumenty a otazník. To znamená, že se nás příkaz zeptá na další argumenty a teprve pak se provede. Template příkazu Set je „NAME, STRING/F“, přičemž jsme mu zadali NAME, a tak se nás ptá na STRING. Ten pak zapíše do systémové proměnné „Vstup“. Další příklad spočítá velikost zadaného adresáře:

.key DIR
.bra {
.ket }
List „{DIR}“ ALL FILES TO T:q{$$} LFORMAT „Set SUM *Eval *$SUM+%l*“
Set SUM 0
Resident C:Eval PURE
Execute T:q{$$}
Resident Eval REMOVE
Echo „Velikost adresare = $SUM“
UnsetENV T:q{$$}

Klíčový je zde čtvrtý řádek. Příkaz List vypíše všechny sou bory ze zadaného adresáře do souboru q{$$} ({$$} bude nahrazeno číslem procesu), a to ve formátu „Set SUM Eval $SUM+%1`“ (aby shell nepovažoval dolar a zpětné apostrofy za řídící znaky, musíme před ně napsat hvězdičku). Místo jména souboru bude List vypisovat výše uvedený řetězec, ve kterém nahradí „%l“ délkou vypisovaného souboru. Tento výstup předložíme příkazu EXECUTE, který bude na každém řádku nastavovat proměnnou SUM na hodnotu SUM + délka souboru. Poslední řádek také stojí za povšimnutí. Ať se vám to zdá jakkoliv drastické, výsledkem tohoto příkazu je smazání souboru T:q{$$). UnsetENV se ,obyčejně používá na odstranění globální systémové proměnné, která se ovšem nachází na logickém zařízení ENV:. Stačí však zadat jméno proměnné jako absolutní cestu a místo proměnné v ENV: se smaže kterýkoliv soubor na disku, třeba i prázdný adresář. Pokud bychom chtěli jenom spočítat všechny soubory v adresáři, máme o něco jednodušší práci.
Při Listování (do souboru) budeme místo jména souboru vypisovat pouze prázdný řádek a nakonec prohlásíme velikost výstupu příkazu List (což bude náš soubor se samými prázdnými řádky) za počet souborů v adresáři (a ono tomu tak opravdu bude):
 

.key DIR
.bra {
.ket }
List „{DIR}“ ALL FILES TO T:q{$$} LFORMAT „“
List T:q{$$} LFORMAT „Napočítal jsem %l souborů.“
UnsetENV T:q{$$}

Další méně známou vlastností mechanismu čtení argumentů je řetězec „*n“, který je automaticky nahrazen znakem nového řádku. To se nám výborně hodí právě do parametru LFORMAT, protože pak budeme schopni provést s jedním souborem více akcí najednou. Script který uvedu, z smaže aktuálního adresáře všechny soubory, které mají nulovou délku.

List „“ TO T:qqq LFORMAT „IF %l eq empty*nDelete*“%s%s*“*nEndIF“
Execute T:qqq
UnsetENV T:qqq

Atraktivní způsob využití scriptů je příprava dat pro různé programy. Když někdy pracuji s grafikou a potřebuji si prohlédnout více fontů, použiji skriptík, který mi vytvoří amigaguide soubor pro MultiView, ve kterém si prohlédnu všechny fonty začínající například písmenem „T“ (při prohlížení příliš velkého množství fontů by mohly nastat všeliké problémy).

Echo „@Database
Fonts*n“ TO RAM:Fonts.guide
List FONTS:T#?.font >> RAM:Fonts.guide LFORMAT „@{*“ %m *“ Link %m }“
Echo „*n@EndNode“ >> RAM:Fonts.guide
List FONTS:T#?.font >> RAM:Fonts.guide LFORMAT „@node %m %n*n@font %n 64*n%m*n@EndNode*n“
MultiView RAM:Fonts.guide
UnsetENV RAM:Fonts.guide

Jak jde vidět, s příkazem List se dá zvládnout skoro vše. V některých případech může tvořit samotný parametr LFORMAT dokonce více než polovinu délky scriptu!

Pár fint na závěr
Buffery pro partitiony se dají nastavit v HDToolBoxu a při každém nabootování se automaticky použije pro partition tolik bufferů, kolik mu nastavíte (implicitně 30).
Číselné argumenty v shellu můžeme zadávat v desítkové, šestnáctkové, nebo v osmičkové soustavě, záleží na tom, jestli číslo začíná řetězcem „0x“ (hexadecimální), nulou „0“ (oktalová), nebo jestli je zapsáno obyčejně (dekadická soustava).
Clipboard bývá často zapsán v souboru CLIPS:0. Pokud dáte v nějakém programu funkci :Copy to Clipboard“, snad to tam najdete zapsané jako IFF soubor. Pokud naopak zapíšete do CLIPS:0 správná data, můžete to využít pro funkci „Paste“. Nedoporučuji se na to příliš spoléhat.
Zařízení DF0: se dá odmontovat pomocí „Assign DF0: DISMOUNT“ a následně Assignovat kam chcete. Hodí se to například u hry K204, která se ptá systému na DF0: kvůli ukládání pozic.
Pokud si ENV: Assignujete někam na disk, nemusíte ho ve Startup-sequenci plnit z ENVARC:, čímž se bootování výrazně urychlí. Zařízení T: mějte raději v RAM:, mít ho na disku by zpomalovalo a disk by se vám často mohl validovat.
Pokud chcete ve scriptu používat řetězec {$$}, musíte na začátku uvést „.key“, bez něj to nebude fungovat. Pokud ale nechcete, aby script měl nějaké parametry, můžete použít se stejným efektem řetězec ($process).
Po provedení příkazu EXECUTE se zapomenou provedené příkazy „LAB“. Znamená to, že těsně po EXECUTE nebude fungovat :SKIP Návěští BACK“. Neznám způsob, kterým by se to dalo jednoduše obejít.
Nejrychlejší způsob, jak dostat na disketu spoustu souborů v mnoha adresářích je tento: Namontujte si RAD: o stejném počtu stop, bloků a hlav jako má standardní zařízení DF0: (takový vytvoříte, když ve standardním mountlistu pro RAD nastavíte HighCyl=79). Do tohoto :RAD“ nakopírujte vše, co potřebujete dostat na disketu a proveďte příkaz „DiskCopy RAD: DF0:“.Pokud jste v adresáři DEVS: soubor mountlist nenašli, aplikujte uvedený postup na soubor SYS:Storage/DOSDrivers/RAD. V tomto případě se hodnota „HighCyl“ nastavuje v ToolTypech příslušné ikony.
Zařízení RAD: můžete mít více. Například mountlist RAD1: vyrobíte z mountlistu pro RAD: tak, že v něm nastavíte „Unit = 1“ a změníte jméno zařízení na RAD1:. Často používané programy můžete spouštět zmáčknutím libovolné klávesové kombinace. Umí to zařídit systémová komodita „FKey“. Rozběhnutí DirWorku z HD je potom záležitostí necelé vteřiny i na nerozšířené A1200; kam se hrabe Pentium s tlačítkem „Start“ ve Windows!
Když si necháte vypsat informace o ikoně nějakého disku (Pravá Amiga-1) a nebude to právě Ram Disk, pravděpodobně uvidíte položku Default Tool a v ní napsané „SYS:System/DiskCopy“. Toto je program, který se má spustit, pokud ikonku hodíte na ikonu jiného disku. Pokud si tam napíšete například „SYS:Games/Sokoban/ASokoban“, uložíte to a hodíte tuto ikonu na ikonu jiného disku, můžete si poté zahrát Sokobana, nebo cokoliv, co se vám zamane (a budete tam mít zapsané).
Nakonec si můžete vyzkoušet jeden žert. Vložte do disketové mechaniky disketu naformátovanou pod jménem CON a spusťte příkaz NewShell.



Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.

Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing