Suplement do Amiga DOS ---------------------- NÓÛ I WIDELEC Kilku Czytelników poinformowaîo mnie, ûe nie podobaî im sië przykîad (uûyty w jakimô odcinku cyklu o Amiga DOS), uûywajâcy operatorów .key czy .bra, gdyû nie rozumiejâ, o co tutaj chodzi. Faktycznie, nie wyjaôniaîem znaczenia .key, .bra i .ket, chcâc to zrobiê dopiero po opisie rozkazów. Jednak skoro taka jest wola ludu -- zrobië to juû teraz, rozumiejâc rozterki duchowe tych wszystkich, którzy nie lubiâ przepisywaê zaîâczonych przykîadów bezrozumnie, jak maîpy. Rzeczywiôcie -- trudno jeôê z DOSowego talerza bez korzystania z noûa i widelca. A zatem, kowboje do dzieîa! Marek Pampuch Oba wspomniane "niezrozumiaîki" nie sâ w zasadzie rozkazami AmigaDOS, lecz naleûâ do grupy tzw. operatorów skryptu. Operatory, nie wystëpujâce w jëzykach programowania, a takûe w innych niû AmigaDOS systemach operacyjnych, zostaîy wymyôlone po to, aby umoûliwiê przekazywanie parametrów do skryptu. Aby znów nie byîo "stawania na gîowie", przed opisem samych operatorów naleûy najpierw wyjaôniê pojëcie skryptu AmigaDOS. Skrypt jest zbiorem tekstowym, skîadajâcym sië z rozkazów AmigaDOS. Moûna go stworzyê za pomocâ dowolnego edytora (na przykîad systemowego ED). Skrypt pozwala na wykonanie okreôlonej przez uûytkownika sekwencji operacji, nie wszystkie bowiem rozkazy AmigaDOS mogâ byê wprowadzane "z rëki" w CLI lub Shellu. Bardziej zaawansowani programiôci mogâ posîuûyê sië nawet skryptami w celu opracowania nowych, wîasnych, rozkazów AmigaDOS, celem uîatwienia sobie dalszej pracy. Zaletâ skryptu jest to, ûe moûna zmieniaê jego dziaîania wprowadzajâc mu inne parametry, w sposób podobny, jak opisywaîem to przy rozkazie ALIAS AmigaDOS-u. Ten ostatni rozkaz ma jednak doôê ograniczone moûliwoôci, podczas gdy napisany przez uûytkownika skrypt, w poîâczeniu z umiejëtnie przekazanymi doï parametrami, moûe mieê moûliwoôci wprost nieograniczone. Nie bëdë sië tutaj zagîëbiaî w techniki pisania skryptów, nikt bowiem, kto umie naciskaê klawisze i wie, o co mu chodzi (na przykîad po doksztaîceniu sië z cyklu "System na talerzu"), nie powinien mieê z napisaniem takiego skryptu problemów, chyba ûe... w grë wejdâ, bëdâce tematem tego artykuîu, operatory skryptowe. Teoria Jak juû zaznaczyîem na poczâtku, operatory takie sîuûâ do przekazywania parametrów do skryptu. Po co to komu i z czym to sië je? Czasem zachodzi potrzeba zmiany sposobu dziaîania skryptów przez wprowadzenie parametrów. Ale jak to zrobiê? Poza rozkazem ASK, gdzie moûna wprowadziê odpowiedú typu Y (tak) lub N (nie), AmigaDOS nie ma rozkazów typu "input". I wîaônie w tym celu wymyôlono operatory skryptowe. Parametr podany przy wywoîaniu rozkazu spod Shella lub CLI zostanie za ich pomocâ przekazany w to miejsce w skrypcie, gdzie wystâpi odpowiedni operator skryptu. Skrypt zostanie uruchomiony z odpowiedniâ wartoôciâ parametru. Jak to sië dzieje? W skrypcie (po odpowiednim operatorze skryptowym) wystëpujâ nazwy zmiennych, czyli îaïcuchy zîoûone z liter i cyfr, zaczynajâcych sië zawsze od litery. AmigaDOS tworzy w katalogu tymczasowym T: zbiór (na przykîad o nazwie T:Command-00-01). Za pomocâ tego tymczasowego skryptu (który uûytkownika wîaôciwie nie powinien obchodziê) AmigaDOS zarzâdza zmiennymi. UWAGA: Jest bardzo waûne, aby, jeôli zmienne majâ nastëpnie wystëpowaê w rozkazie ECHO, umieszczaê je w nawiasach trójkâtnych, na przykîad: --------****** PROSZË TU UWAÛAÊ NA TAGI (NIESTETY JUÛ DO SAMEGO KOÏCA !!!! *******-------- ECHO "Dzien dobry " Operatory skryptowe majâ jeszcze jedno znaczenie. Jak juû zapewne wiecie (z samego poczâtku kursu AmigaDOS), istniejâ pewne znaki, które sâ "ôwiëtymi krowami", i nie wolno ich uûywaê, bo AmigaDOS rezerwuje je sobie do jakichô swoich niecnych celów. Podobnie jak w wypadku ludzi, nie ma jednak znaków "niezastâpionych". Jeôli z jakichkolwiek przyczyn "musicie" uûyê w tekôcie programu jednego z nastëpujâcych znaków: "$" (znak dolara), "." (kropka), ">" (wiëksze niû), czy "<" (mniejsze niû), wówczas z pomocâ takûe przyjdâ odpowiednie operatory skryptowe. Skoro juû wiemy z grubsza, co to takiego, czas na przedstawienie bohaterów naszego dzisiejszego spektaklu. Oto oni (w porzâdku alfabetycznym): .BRA -- pozwala na zastâpienie znaku "<" (mniejsze niû), oznaczajâcego otwarcie nawiasu trójkâtnego, ale i redyrekcjë rozkazu w AmigaDOS. Aby zatem uniknâê kolizji, skrypty, zawierajâce jakâkolwiek redyrekcjë, muszâ zawieraê teû ten operator. .DEF -- pozwala na przekazanie do skryptu definicji, czyli îaïcucha alfanumerycznego. .DOLLAR -- pozwala na zastâpienie znaku "$". .DOT -- pozwala na zastâpienie znaku ".". .KET -- pozwala na zastâpienie znaku ">" (wiëksze niû). Wszystkie uwagi, podane przy operatorze .BRA, takûe i tu majâ zastosowanie. .KEY -- jest to chyba najwaûniejszy z operatorów skryptowych. Umoûliwia on przekazanie do skryptu parametru, którego nazwa znajdzie sië po tym operatorze. Operator .KEY powinien zatem zawsze wystëpowaê na poczâtku skryptu, do którego chcemy takie parametry przekazywaê. Dopuszcza sië stosowanie nie tylko pojedynczego, ale takûe dwóch lub wiëcej przekazywanych w ten sposób parametrów. W tym drugim wypadku parametry powinny byê oddzielone spacjami w rozkazie wywoîujâcym: EXECUTE TEST Poniedzialek Wtorek Sroda Czwartek Piatek natomiast odpowiadajâce im zmienne w "przekazujâcym" operatorze skryptowym muszâ byê oddzielone przecinkami: .KEY n1,n2,n3,n4,n5 UWAGA: Zmienne przy .KEY nie przenoszâ wartoôci cyfrowych do rozkazu EVAL. Skoro juû napompowaîem Was teoriâ, zobaczmy, jak to wszystko bëdzie wyglâdaîo na ekranie komputera. Praktyka * Przykîad skryptu z operatorem .KEY Wpiszmy za pomocâ dowolnego edytora nastëpujâcy tekst (naleûy przy tym pamiëtaê, aby rozkaz z operatorem .KEY znalazî sië w pierwszym wierszu skryptu. Nie naleûy takûe zapominaê o poprzedzajâcej go kropce i pilnowaê, aby nie byîo spacji pomiëdzy kropkâ a nazwâ operatora.) .KEY n1,n2,n3 ECHO "Czesc " ECHO "Czesc " ECHO "Czesc " ECHO "Witajcie wszyscy troje" Zapiszmy taki skrypt pod nazwâ "df0:test". Przypuôêmy, ûe odwiedziîa nas trójka znajomych. Moûemy teraz uruchomiê nasz skrypt, wpisujâc z CLI lub Shella (a jeôli mamy jeden z nowszych systemów operacyjnych, nawet opcjâ WORKBENCH/EXECUTE COMMAND z gîównego menu Workbencha): EXECUTE df0:test Bartek Marcin Adam Jeôli nasi kumple majâ inne imiona, to oczywiôcie wystarczy zmieniê parametry podczas wywoîywania. Taki pokaz robi wraûenie, zwîaszcza wówczas, jeôli nasi kumple sâ kloniarzami. Aby ich doszczëtnie zaîamaê i zabezpieczyê sië przed posâdzeniem o oszustwo, wystarczy uruchomiê go jeszcze raz z dowolnymi trzema podanymi przez nich imionami. No dobrze, ale co zrobiê, jeôli mamy juû gotowy powyûszy skrypt, a (powiedzmy) Adam zachorowaî, i odwiedzili nas tylko pierwsi dwaj? Skrypt zostanie takûe wykonany, a w miejscu trzeciego imienia zostanie wypisane samo sîowo "czeôê". Nie zawsze jest to wygodne. Istnieje jednak sposób na poradzenie sobie w takich wypadkach. Wystarczy dokonaê niewielkiej zmiany w skrypcie (a dokîadniej w wierszach ze zmiennymi) na: ECHO "Czesc " ECHO "Czesc " ECHO "Czesc " gdzie w miejscu sîowa "Marek" wpiszemy wîasne imië. Zapiszmy tak poprawiony skrypt w miejsce poprzedniego. Teraz moûemy juû uruchomiê skrypt nawet wtedy, gdy odwiedzi nas dwóch kolegów. Trzecim przywitanym bëdzie autor skryptu. Jeôli natomiast bëdziemy usiîowali przy wywoîaniu takiego skryptu przekazaê wiëcej parametrów niû wynosi liczba zmiennych przy parametrze .KEY, wówczas po wywoîaniu takiego skryptu pojawi sië na ekranie komunikat: Parameters unsuitable for key >nazwa klucza< Wrong number of arguments Execute failed returncode 10 i nasz skrypt nie zostanie wykonany. Parametr .KEY dopuszcza stosowanie przeîâczników umieszczonych we wzorcach rozkazów AmigaDOS, niestety, nie wszystkich. Dopuszczalne sâ nastëpujâce przeîâczniki: /A -- argument konieczny /F -- argument ostatni /K -- argument opcjonalny /S -- przeîâcznik Moûemy to wykorzystaê na przykîad w naszym skrypcie, ograniczajâc liczbë parametrów, moûemy takûe w razie potrzeby stosowaê nazwy zmiennych, zamieszczane we wzorcach rozkazów AmigaDOS. * Przykîad skryptu z operatorem .BRA i .KET zostaî podany przy opisie rozkazu DPAT AmigaDOS w nr. 1/95 Magazynu AMIGA (i wywoîaî burzë w szklance wody). * Przykîad skryptu z operatorem .DEF .KEY kom .DEF kom = "nic tutaj nie ma" ECHO "Komunikat mowi ze " Jeôli zapiszemy taki skrypt na dysku i uruchomimy go przez: execute df0:test to otrzymamy oczywiôcie na ekranie wydruk: Komunikat mowi ze nic tutaj nie ma Spróbujmy jednak uruchomiê skrypt z parametrem: execute df0:test pecety to dno! To, co pojawi sië na ekranie, pozostawiam Waszej domyôlnoôci. UWAGA: Nazwa zmiennej (lub zmiennych) definiowanych przez .DEF musi znaleúê sië najpierw przy operatorze .KEY. * Przykîad skryptu z operatorem .DOLLAR Zmienna $ jest uûywana przez system operacyjny do okreôlania zmiennych ôrodowiskowych (skorzystaliômy z tego przy poprawianiu "skryptu powitalnego"). Na marginesie: tu juû nie zmieszczë odpowiedniego opisu, ale wydaje mi sië, ûe i zmienne ôrodowiskowe powinny doczekaê sië takiego "suplementu". Wróêmy jednak do naszych baranów. Operator .DOLLAR pozwala nam zamieniê taki znak na jakikolwiek inny. Poprawmy nasz skrypt z przywitaniem na: .KEY n1,n2,n3 .DOLLAR ! ECHO "Czesc " ECHO "Czesc " ECHO "Czesc " ECHO "Witajcie wszyscy troje" Moûe akurat w tym wypadku wyglâda to niezbyt ciekawie, ale w wielu sytuacjach bardzo sië przydaje. W podobny sposób zamieniamy kropkë, wykorzystujâc operator .DOT, jednak sâ to zdecydowanie rzadsze przypadki (pewnie, kaûdy woli mieê bardziej do czynienia z dolarami niû znaleúê sië w kropce). * Multitasking Korzystanie z operatorów skryptowych pozwoli Wam teû na nieco peîniejsze wykorzystanie wielozadaniowoôci Amigi (choêby tylko po to, aby zaîamaê znajomych kloniarzy). Podczas tworzenia takich skryptów naleûy pamiëtaê o tym, ûe wprawdzie da sië uruchomiê kilka skryptów równolegle, jednak przy zachowaniu pewnych zasad. Przede wszystkim naleûy przestrzegaê reguîy, by w takich "multitaskingowych" skryptach nie powtarzaîy sië takie same nazwy zmiennych. To nie wszystko. Wiemy, ûe podczas wykonywania takiego skryptu w katalogu T: tworzony jest zbiór tymczasowy. Jeôli uruchomimy inny skrypt, to utworzy on zbiór w tym samym katalogu, który moûe mieê identycznâ nazwë. Oczywiôcie spowoduje to wykasowanie poprzedniego zbioru, który nie jest zabezpieczany przed zamazywaniem. Moûna temu zapobiec wîaônie przez wykorzystanie operatorów skryptowych. Przypuôêmy, ûe napisaliômy skrypt do sortowania katalogu i wyôwietlania go na ekranie, jak poniûej: .Key PATH/A, PATTERN/K ECHO "SORTOWANIE" LIST " TO RAM:TEST<$$> SUB= SORT RAM:TEST<$$> TO RAM:OK<$$> TYPE RAM:OK<$$> DELETE RAM:(TEST<$$>|OK<$$>) QUIET WAIT 5 SECS Jeôli teraz zapiszemy taki skrypt i bëdziemy go uruchamiaê równolegle w róûnych zadaniach, wówczas zbiory tymczasowe Test i OK bëdâ miaîy nadane przez zmiennâ ôrodowiskowâ $$ numery zadaï (na przykîad 1, 2, 3 itd.) i nie nastâpi kolizja. Oczywiôcie, aby uruchomiê taki skrypt, musimy podaê mu parametr okreôlajâcy nazwë katalogu ze ôcieûkâ dostëpu (uûyty przeîâcznik /A spowoduje, ûe przy braku tego parametru zamiast listy posortowanych zbiorów otrzymamy komunikat o bîëdzie). Parametr wzorca jest opcjonalny, jeôli go nie podamy przy wywoîywaniu skryptu, wówczas zostanie wyôwietlony ustawiony domyôlnie caîy katalog. Na zakoïczenie Podczas tworzenia skryptów AmigaDOS z operatorami (lub bez nich) naleûy jeszcze pamiëtaê o kilku sprawach: * skrypty przewaûnie zapisuje sië w katalogu S:, choê nie jest to konieczne; * aby uruchomiê taki skrypt moûna uûyê rozkazu execute >nazwa skryptu< samo bowiem wpisanie nazwy skryptu i naciôniëcie klawisza [Return] spowoduje komunikat "file is not executable" i w rezultacie nasz skrypt niczego nie zrobi. Istnieje jednak pewien sposób na ominiëcie tej niedogodnoôci, wygodnej zwîaszcza dlatego, ûe skorzystanie z rozkazu EXECUTE nie zawsze jest moûliwe czy poûâdane w danej sytuacji. Aby umoûliwiê bezpoôrednie wywoîanie skryptu przez podanie jego nazwy, wystarczy (po zapisaniu go na dysku) ustawiê mu bit protekcji S. Moûna to zrobiê z poziomu AmigaDOS przez: protect S:>nazwa skryptu< +S lub wykorzystujâc odpowiedniâ opcjë w jednym z programów do zarzâdzania danymi (FileMaster, DiskMaster itp.). UWAGA: Jeôli w takim skrypcie dokonasz jakiejkolwiek poprawki, wówczas bit protekcji S zostanie przy powtórnym zapisie automatycznie wyîâczony. Naleûy zatem ustawiê go ponownie. A tak na marginesie: jeôli czegoô nie rozumiecie z kursu o AmigaDOS, piszcie do mnie (pod adresem redakcji). Postaram sië Wam rozjaôniê wszystkie, niezbyt precyzyjnie opisane, sprawy.