COMMAND.PRG "sapienti sat" 1 Inhalt ====== Einleitung zu 'command.prg' . . . . . . . . . . . . . . . . . . . 2 I. Allgemeine Hinweise zum Programm . . . . . . . . . . . . . . . 3 II. Allgemeine Befehle . . . . . . . . . . . . . . . . . . . . . 7 i) 'Besondere' allgemeine Befehle . . . . . . . . . . . . . . 38 III. Externe Kommandos und Utilities . . . . . . . . . . . . . . 40 i) Einfhrung . . . . . . . . . . . . . . . . . . . . . . . . 40 ii) Funktionen . . . . . . . . . . . . . . . . . . . . . . . . 41 IV. Die ALIAS-Einrichtung . . . . . . . . . . . . . . . . . . . . 80 i) Einfhrung . . . . . . . . . . . . . . . . . . . . . . . . 80 ii) ALIAS-Befehlssatz . . . . . . . . . . . . . . . . . . . . 81 V. Die History-Einrichtung . . . . . . . . . . . . . . . . . . . 83 i) Einfhrung . . . . . . . . . . . . . . . . . . . . . . . . 83 ii) Die !-Befehle . . . . . . . . . . . . . . . . . . . . . . 85 VI. Das Batch-Processing . . . . . . . . . . . . . . . . . . . . 86 i) Einfhrung . . . . . . . . . . . . . . . . . . . . . . . . 86 ii) Befehlssatz . . . . . . . . . . . . . . . . . . . . . . . 87 iii) Beispiele . . . . . . . . . . . . . . . . . . . . . . . . 102 iv) 'command.prg' im AUTO-Ordner . . . . . . . . . . . . . . . 104 VII. Variablen . . . . . . . . . . . . . . . . . . . . . . . . . 107 i) Allgemeines zu den Variablen . . . . . . . . . . . . . . . 122 ii) Beispiele . . . . . . . . . . . . . . . . . . . . . . . . 123 VIII. EDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 i) Einfhrung . . . . . . . . . . . . . . . . . . . . . . . . 126 ii) Die Kommandos von EDI . . . . . . . . . . . . . . . . . . 126 IX. Fehlermeldungen . . . . . . . . . . . . . . . . . . . . . . . 128 X. Die Ausgabeumleitung . . . . . . . . . . . . . . . . . . . . . 133 XI. Die Eingabeumleitung . . . . . . . . . . . . . . . . . . . . 135 XII. Allgemeines Blabla zum Schluá . . . . . . . . . . . . . . . 137 i) Programm- und Dateiumfang . . . . . . . . . . . . . . . . . 137 ii) Zur Programmierung . . . . . . . . . . . . . . . . . . . . 138 A. ANHANG (Befehlszusammenfassung) . . . . . . . . . . . . . . . 141 B. ANHANG (News) . . . . . . . . . . . . . . . . . . . . . . . . 145 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 2 Einleitung zu 'command.prg' =========================== 'command.prg' ist ein Kommandointerpreter (auf Neudeutsch auch COMMAND-LINE-INTERPRETER oder COMMAND-LINE-INTERFACE), der auf herk”mmliche Art (wie z.B. MS-DOS o.„.), also ohne GEM, Maus und Desktop, die Arbeit mit dem ATARI untersttzen soll. Er umfaát die dafr blichen Funktionen wie z.B das Filekopieren, das Filel”schen oder die Fileumbenennung. šber eine Historyeinrichtung, die es in „hnlicher Form unter UNIX und VMS gibt, wird es auf einfache Weise m”glich gemacht, alte Eingaben wieder zu holen. Einige Befehle wurden bei UNIX abgeschaut, andere bei VMS oder MINIX. Im folgenden findet sich eine Zusammenstellung der Befehle mit Beschreibung, sowie Erkl„rungen zu den zus„tzlichen Features wie beispielsweise das Batchprocessing. Im Anhang findet sich ein Abschnitt namens 'News' (auch ANHANG C genannt), der die Žnderungen zur letzten ver”ffentlichten Version des Programms kurz beschreibt. Will man sich jetzt nicht gerade die komplette Datei 'command.txt' zu Gemte fhren, m”chte ich auf das Kommando "man" verweisen. Dessen Beschreibung findet sich im Abschnitt ber die 'externen Kommandos'. Es l„át die selektive Ausgabe von Befehlsbeschreibungen aus der vorliegenden Datei zu. Es versteht sich wohl von selbst, daá ich fr das korrekte Funktionieren des Programms keine Garantie bernehme. Datenverluste, die durch eventuell auftretende Programmfehler (was ich natrlich nicht hoffen will) oder eine fehlerhafte Bedienung verursacht worden sind, hat jeder selbst zu verdauen! Gefundene Fehler oder Probleme bitte ich an mich weiterzuleiten (meine Adresse findet sich im 'Allgemeinen Blabla'-Abschnitt). ALLGEMEINE HINWEISE 3 I. Allgemeine Hinweise zum Programm =================================== Um wirklich sinnvoll mit dem Interpreter arbeiten zu k”nnen, ist die Verwendung einer Harddisk ein Muá! Hat man gengend Speicher, kann man sich allerdings auch mit einer ausreichend groáen RAM-Disk behelfen. Will man keine oder nur selten externen Kommandos aufrufen bzw. kommt man mit den eingebauten Kommandos aus, steht allerdings einer Arbeit mit Diskettenlaufwerken nichts im Weg. Das Programm ist ein ziemlicher Speicherfresser. Bei einigen Befehlen macht sich ein reichlich zur Verfgung stehender freier Speicher in einer h”heren Arbeitsgeschwindigkeit bemerkbar. Dies gilt in der Hauptsache fr die Kopierkommandos. Einige der weiter unten aufge- fhrten externen Kommandos reservieren sich fr ihre Arbeit das kom- plett frei verfgbare RAM. Je mehr sie erhalten k”nnen, um so weniger Zugriffe auf einen Massenspeicher wie z.B. eine Harddisk sind n”tig und, daraus resultierend, h”her ist die Geschwindigkeit. Ruft man vom Interpreter andere Anwendungen auf, die selber auch viel freien Speicher ben”tigen, kann es bei Systemen mit kleinem Memory- Ausbau bzw. ungengend zur Verfgung stehendem freiem RAM zu ziemli- chen Problemen kommen. In solchen F„llen muá der Anwender entschei- den, ob er den Interpreter benutzen m”chte und dafr vielleicht seine RAM-Disk etwas kleiner macht oder Accessories entfernt. Ich weiá nicht, ob das Programm auf einem TT l„uft. Mit STs, MEGA-STs und MEGA-STEs gibt es keine Probleme. Im 'Allgemeinen Blabla'-Ab- schnitt findet sich eine Zusammenstellung der TOS-Versionen und Abarten mit denen ich den Interpreter ausprobiert habe. Waren in den ersten Versionen von 'command.prg' alle Kommandos fest eingebaut, bin ich inzwischen dazu bergegangen, sogenannte 'externe Kommandos' zu erzeugen. Das sind eigenst„ndige Programme, die vom Interpreter aufgerufen werden k”nnen. Es ist selbstverst„ndlich m”glich, diese Programme auch vom DESKTOP oder einer anderen Shell aufzurufen. Wildcards: ---------- Fr Leute, die mit diesem Begriff nichts anfangen k”nnen, mit Wildcard bezeichnet man die beiden Zeichen '?' und '*'. Sie stellen Platzhalter fr beliebige andere Zeichen dar. Dabei repr„sentiert '?' genau ein Zeichen, '*' eine unbestimmte Anzahl. Beim Arbeiten mit Dateien macht man h„ufigen Gebrauch von ihnen. Beispielsweise wrde '*.c' sich auf alle Dateien beziehen, die die Extension '.c' haben (z.B. 'abc.c', 'test.c' usw.). 'xyz.???' steht fr Dateien, die mit 'xyz' beginnen und eine beliebige aus drei Zeichen bestehende Exten- sion haben k”nnen (z.B. 'xyz.prg'). 'a?c.c' wrde sich auf alle Dateien beziehen, deren Name mit 'a', gefolgt von einem beliebigen Zeichen, beginnt, mit einem abschlieáenden 'c' vor dem Punkt und einem 'c' als Extension. Die meisten Kommandos von 'command.prg', die sich in irgendeiner Weise mit Files besch„ftigen, lassen die Verwendung dieser Zeichen zu. ALLGEMEINE HINWEISE 4 Tastenfunktionen und Kommandozeile: ----------------------------------- Die Eingabe eines Befehls kann mit Hilfe der Cursortasten, der -Taste, der -Taste, der -Taste und einigen Tastenkombinationen modifiziert werden werden: Taste: | Bedeutung: ------------------+------------------------------------------------- | l”scht Zeichen unter Cursor | | l”scht eingegebene Zeile | | l”scht Zeichen links von Cursor | | l”scht Wort unter Cursor | | l”scht alle Zeichen von Cursor bis Zeilenanfang | <'<-'> | setzt Cursor eine Position nach links | <'->'> | setzt Cursor eine Position nach rechts | | setzt Cursor an Zeilenanfang | '> | setzt Cursor an Zeilenende | '> | setzt Cursor ein Wort nach rechts | | setzt Cursor ein Wort nach links | | zeigt Nummer des aktuellen Befehls an | | vertauscht die beiden Zeichen vor dem Cursor | | gibt eingegebene Zeile neu aus | | holt vorhergehendes Kommando (siehe History) | | holt nachfolgendes Kommando (siehe History) | | expandiert Wort unter Cursor zu vollem Dateinamen | | gibt Liste aller eingebauten Befehle aus | | Ausgabe der vorhandenen Alias-Eintr„ge | | '\'-Zeichen (Backslash) | | abschlieáen einer Eingabe (auch mit ) | '->' / '<-' stehen hier fr die /-Tasten. Die Ausfhrung eines Kommandos kann man h„ufig durch abbrechen. Die Funktionstaste kann bei einigen Kommandos zum Anhalten/Fort- ALLGEMEINE HINWEISE 5 fhren der Bildschirmausgabe benutzt werden (z.B. bei "cat" oder "find"). Man befindet sich brigens die ganze Zeit in einem Einfgemodus, d.h. beim Korrigieren einer Zeile werden keine Zeichen berschrieben sondern nach rechts verschoben. šberflssige Zeichen muá man also explizit l”schen! Wird bei einer Eingabe das Zeilenendes erreicht, erfolgt ein Sprung zur n„chsten Zeile. Es ist allerdings nicht m”glich, von dieser Folgezeile mit den Cursortasten wieder in die darberliegende Zeile zu kommen (das liegt am VT52-Emulator, der die erste bzw. letzte Spalte einer Zeile als Grenze nimmt). Intern wird aber sehr wohl angenommen, daá man sich ber verschiedene Zeilengrenzen bewegt (bzw. gibt es berhaupt keine Zeilen, sondern nur einen Eingabepuffer, der 80 Zeichen groá ist). Wenn man nicht aufpaát, kann es also zu einem ziemlichen Durcheinander kommen. Ich glaube aber, daá die Vorteile dieser Eigenschaft die Nachteile berwiegen und habe sie deshalb zugelassen (mit wird eine Zeile immer wieder neu ausgege- ben). Viele Befehle erwarten mehrere Argumentangaben oder lassen optional mehrere Argumente zu. Diese mssen jeweils durch einen Blank abge- grenzt sein, z.B. wrde "dir *.prg *.tos" zuerst alle PRG- und dann alle TOS-Dateien des aktuellen Verzeichnisses aufzeigen. In Verbindung mit Anfhrungszeichen ist es m”glich, Leerzeichen in einem Argument zu benutzen. Das vorhergehende Beispiel besitzt in der vorliegenden Form die beiden Argumente '*.prg' und '*.tos', bei Verwendung von Anfhrungszeichen(also "*.prg *.tos") nur ein Argument! Diese Erweiterung der Eingabe sollte allerdings nur bei Kommandos, die sich mit Stringverarbeitung besch„ftigen, Anwendung finden (z.B. "string"). Andere Befehle, wie hier "dir", spalten ein solches Argument nicht weiter auf und geben fr gew”hnlich auch keine Fehlermeldung aus! Soll eine Eingabe explizit ein Anfhrungszeichen haben, muá vor diesem ein '%' stehen. Es ist auáerdem erlaubt, die beim Kommando "echo" beschriebenen Steuerzeichen zu benutzen. ACHTUNG! Diese Interpretation von '"' und Steuerzeichen gilt nur fr die direkt in den Interpreter eingebauten Befehle. An externe Programme wird die Argumentzeile unbearbeitet bergeben! Eingaben k”nnen sowohl groá- als auch kleingeschrieben werden. Das erste Wort jeder Eingabe wird intern allerdings 'immer' in Klein- schreibung umgewandelt! Alle folgenden W”rter (besser vielleicht Argumente genannt), bleiben unbehandelt. Bei der folgenden Befehlsbeschreibung sind '[ ]'-Argumentangaben als optional zu verstehen und '< >' als zwingend. Sind Argumente z.B. durch '(s)' als Plural gekennzeichnet, bedeutet dies, daá mehrere Argumente angegeben werden k”nnen (nicht mssen). Wie man wohl bereits gesehen hat, sind Tasten durch '<..>' gekenn- zeichnet (z.B. steht fr die RETURN-Taste). Befehle sind im Text in Anfhrungszeichen gehalten. Viele der Befehle lassen die Verwendung von speziellen Optionen zu. Diese mssen man durch ein voranzustellendes '-'-Zeichen kenntlich machen. ALLGEMEINE HINWEISE 6 Es gibt eine ganze Reihe von Fehlermeldungen, die es dem Benutzer erleichtern sollen, einen Fehler bzw. ein aufgetretenes Problem zu erkennen. Durch die Verbindung einer Fehlermeldung mit einer Fehler- nummer, ist der Benutzer von Batch-Dateien in der Lage, auf bestimmte Situationen individuell zu reagieren. Aufruf anderer Programme: ------------------------- Eine weitere F„higkeit des Interpreters soll auch schon an dieser Stelle Erw„hnung finden. Man kann von ihm aus externe Programme aufrufen. Kann ein eingegebenes Kommando nicht als interner Befehl erkannt werden, wird versucht, ob es ein Programm gibt, daá diesem Befehlsnamen entspricht. Ist dies der Fall, wird es aufgerufen (das bezieht sich auf 'APP', 'TOS', 'TTP' und 'PRG'-Dateien). Diese mssen nicht mit ihrem vollen Namen bezeichnet werden! Es wird das erste Programm gestartet, daá mit dem eingegebenen Teilstring bereinstimmt und eine der obigen Extensions hat. Diese automatische Erweiterung kann man natrlich auch abschalten. Soll z.B. ein Programm 'programm.tos' aufgerufen werden, gengt es 'programm' oder sogar noch weniger Zeichen einzugeben, um es zu starten. Es versteht sich wohl von selbst, daá eingegebene Argumente an diese Programme weitergegeben werden (dies allerdings nicht nach dem xArg- Verfahren, sondern nach der blichen UNIX bzw. VMS-Funktionsweise mit 'argc[]' und 'argv[]'!). Der Benutzer hat die M”glichkeit, bestimmte Ordner anzugeben, die zur Suche nach einem solchen Programm abgeklappert werden sollen. Die Befehle (bzw. die šberschriften zu deren Beschreibung) in der folgenden Beschreibung sind durch ein vorangestelltes '->' und eine einfache Unterstreichung kenntlich gemacht, die Anordnung ist alpha- betisch. Dies fhrt unter Umst„nden bei den beiden Abschnitten ber die Batch-Bearbeitung und die Variablen zu kleineren Problemen, da die einzelnen Ausfhrungen und Beispiele sich immer wieder auf Kom- mandos beziehen, die noch nicht beschrieben worden sind. Hat man sich allerdings einen gewissen šberblick verschafft, drfte die alphabeti- sche Organisation beim schnellen Auffinden von bestimmten Befehlsbe- schreibungen doch groáe Vorteile haben. Da es zahlreiche Kommandos gibt, die nur durch eine Abkrzung repr„- sentiert sind (z.B. "cp" fr copy), werden dort die vollst„ndigen Ausschreibungen der Kommandos angegeben. Dies scheint mir fr ein einfacheres Einpr„gen der Befehle f”rderlich zu sein. Durch h„ufigen Gebrauch von Beispielen habe ich versucht, die Befehle und ihre Funktion transparenter zu machen. Einige dieser Beispiele enthalten Hinweise, die zu einer bequemeren Handhabung des Interpre- ters fhren sollen. Es ist daher nicht ganz sinnlos, sich mit diesem zus„tzlichen Geschwafel auseinanderzusetzen. Leider passiert es immer wieder, daá ich Modifikationen an der Software durchfhre, ohne eine entsprechende Anpassung an einem eventuell betroffenen Beispiel vorzunehmen. Hier bitte ich, sich in Nachsicht zu ben. Einige der Beispiele, die sich mit der Verarbeitung von Batch-Dateien befassen, sind meiner bescheidenen Meinung nach, recht ntzlich. Wer sie gebrauchen kann, muá sie einfach nur mit einem Texteditor aus dieser Anleitung rauskopieren. Einer Anpassung an eigene Bedrfnisse steht dann nichts mehr im Wege. ALLGEMEINE BEFEHLE 7 II. Allgemeine Befehle ====================== Dieser Abschnitt bezieht sich auf Kommandos, die keinen 'speziellen' Umgebungen, wie sie beispielsweise von Batch-Dateien oder Variablen dargestellt werden, angeh”ren. Man kann sie alle im Direktmodus (also einfach in die Tasten hauen) benutzen. -> appendenv --------------------- (kompletter Name: append to environment string) Um die Bedeutung dieses Kommandos richtig verstehen zu k”nnen, sollte man schon mal etwas vom 'Environment String' geh”rt haben. Die Start- adresse dieser Zeichenfolge wird jedem Programm in der BASEPAGE bergeben. Leute, die mit diesem Begriff vielleicht nichts anfangen k”nnen, seien getr”stet, dessen Bedeutung ist fr die nachfolgenden Ausfhrungen nicht weiter relevant. Man sollte sich eben nur merken, daá jedes Programm in der Lage ist, sich diese Startadresse frs Environment zu holen. Man kann sich den String im brigen mit "env" (kommt etwas sp„ter) anschauen. Wenn man den Interpreter startet, steht dort fr gew”hnlich etwas wie 'PATH=' und 'C:\'. 'PATH' nennt man brigens auch eine Environment Variable, 'C:\' ist ein zugeordneter Wert. "appendenv" kann jetzt benutzt werden, um diesen String zu erweitern, d.h. appendenv PATH=C:\EXTCOM wrde dazu fhren, daá 'PATH' jetzt neben 'C:\' auch noch 'C:\EXTCOM' als Wert hat, d.h. die Variable 'PATH' taucht jetzt zweimal auf. Manchen Programmen (z.B. GNU-C oder SOZOBON-C) kann man auf diese Art und Weise Suchpfade und bestimmte Environment-Variablen mit auf den Weg geben. Da man normalerweise allerdings eine solche Variable immer nur einmal haben m”chte (wenn auch mit mehreren Werten), sollte man vor dem Setzen bereits existenter Eintr„ge "delenv" verwenden! Der Interpreter benutzt eine Variable namens 'MANUAL' die vom "man"- Befehl ausgewertet wird. Eine weitere Variable ist 'TAB'. Einige der externen Kommandos ge- brauchen diese, um die gesetzte Tabulatorweite festzustellen. Dem "sort"-Befehl kann man durch die Variable "SORT" einen Pfad zum Ablegen von Zwischendateien mit auf den Weg geben. Es gibt aber noch einen anderen Grund, der mich zur Implementierung dieses Kommandos veranlaát hat. Im Vorspann kann man nachlesen, daá der Interpreter nicht das xArg-Verfahren zur Weitergabe von Parame- tern untersttzt. Dafr kann aber der von ATARI vorgeschlagene ARGV- Mechanismus benutzt werden. Der funktioniert nun so, daá man 'ARGV' als Environment Variable einfhrt und an diese dann die zu bergeben- den Argumente anfgt, z.B. appendenv ARGV= a b Cde (Groá- und Kleinschreibung wird brigens beachtet). Nehmen wir jetzt mal an, daá vor Ausfhrung dieses Befehls der Environment String aus 'PATH=' und 'C:\' bestanden hat. Jetzt findet man dort 'PATH=', 'C:\', 'ARGV=', 'a', 'b' und 'Cde'. ALLGEMEINE BEFEHLE 8 Da durch dieses Anh„ngen eine praktisch unbegrenzte Argumentl„nge erreicht werden kann, ist bei Programmen, die nach 'ARGV' schauen, kein Problem mit der standardm„áig zu klein geratenen Kommandozeile gegeben. Kommen wir jetzt zu einer kleinen Eigenm„chtigkeiten von 'command.prg'. Da ist diese Sache mit der 127. Diese Zahl muá an aufzurufende Programme bergeben werden, wenn mit ARGV gearbeitet wird. Sie ersetzt die normal anzugebende L„nge der Kommandozeile (das erste Byte dieser Zeile brigens). Da ich jetzt der verrckten Ansicht bin, daá ein externes Programm eigentlich recht gut am Eintrag 'ARGV=' erkennen kann, daá da noch was anderes ist, als nur die Kommandozeile, muá mit "on 17" explizit dieser Gag mit der 127- šbergabe eingeschaltet werden (vgl. auch "on", "off" und "flags")! Man kann also bei dafr ausgelegten Programmen, Argumente normal ber die Kommandozeile und parallel dazu ber den Environment String bergeben, wenn man auf die 127 verzichtet. Die externen Programme (vgl. auch den Abschnitt ber die externen Kommandos) funktionieren brigens allesamt nicht mit ARGV. Ich bin einfach zu faul, die notwendigen Žnderungen durchzufhren. Das liegt zum Teil auch daran, daá man normalerweise mit der L„nge der Komman- dozeile auskommen máte. -> bell ------- Dieser Befehl l„át den ATARI einmal 'klingeln'. Man kann mit diesem Kommando z.B. das Ende einer Batch-File-Bearbeitung akustisch hervor- heben. Man sollte beachten, daá es die M”glichkeit gibt, unter Benutzung des Kontrollfeldes diese Ausgabe zu unterdrcken. -> cat [-s] --------------------- (kompletter Name: concatenate) Gibt den Inhalt eines ASCII-Text-Files auf den Bildschirm aus. Die Ausgabe kann jederzeit mit abgebochen werden. Der Befehl erlaubt es, mehrere Dateien anzugeben. Beim Versuch Dateien auszugeben, die nichtdarstellbare Zeichen besitzen, wie z.B. eine Programmdatei, bricht natrlich das Chaos aus! Durch kann man die Ausgabe anhalten, durch erneuten Druck auf wird sie wieder fortgesetzt. Option | Bedeutung -------+------------------------------------------------------------ s | Es unterbleibt die Ausgabe des Dateinamens und das Warten | zwischen zwei Dateien. | Man kann dieses Kommando brigens auch auf andere Verzeichnisse und Laufwerke anwenden! ALLGEMEINE BEFEHLE 9 BEISPIELE: cat *.c Hier werden alle 'C'-Dateien ausgegeben. cat command.txt test.txt *.dat Es wird erst der File 'command.txt' ausgegeben, dann die Datei 'test.txt' und zum Schluá alle 'dat'-Files. cat /test/*.dat Ausgabe aller 'dat'-Files, die sich im Ordner 'test' befinden. Hier m”chte eine kleine Eigenheit des Interpreters hinweisen, die Verwendung von '/' und '\'. Normalerweise findet unter TOS nur der Backslash Verwendung ('\') wenn es um Verzeichnispfade geht. Wenn es gewnscht wird, wandelt 'command.prg' allerdings '/' in '\' um, so daá man beide Zeichen benutzen kann (vgl. dazu "on / off 8"). -> cd [directory] ----------------- (kompletter Name: change directory) Dieses Kommando wird zum Wechseln von Verzeichnissen benutzt. Soll zu einem Ordner gewechselt werden, gengt es, die ersten Buch- staben (bis Eindeutigkeit hergestellt ist) einzugeben. Es wird immer das erste Verzeichnis angesprungen, daá mit diesem Teilstring ber- einstimmt. Dies gilt auch fr Unterverzeichnisse. Allerdings muá der Pfadname bis auf die letzte Ordnerangabe komplett sein, man kann also keinen Pfad angeben, der vollst„ndig aus Fragmenten von Ordnernamen besteht, anspringen! Es ist ab und zu schon vorgekommen, daá beim Wechseln von Laufwerken zwar so getan wird, als h„tte ein solcher stattgefunden, man sich aber in Wirklichkeit immer noch an der gleichen Stelle befindet. Hier scheint es ein Problem im TOS zu geben (GEMDOS-Routine Dsetdrv() / Dsetpath() bzw. beim Erkennen von Diskettenwechseln). Dieses Verhal- ten habe ich allerdings bisher nur bei Floppylaufwerken beobachten k”nnen. Ramdisks oder verschiedene Partitions einer Harddisk bereiten scheinbar keine Probleme. Ich m”chte mit diesem Hinweis allerdings nicht sagen, daá jetzt dauernd mit dieser Nichtwechselei zu rechnen ist, also keine Panik! Nach einigem Rumprobieren habe ich den Ein- druck gewonnen, daá die Verwendung von "cd \" bei dem betroffenen Laufwerk, dieses Fehlverhalten wieder bereinigt. Zu dieser Problema- tik sollte man sich das beim Befehl "flags" beschriebene Flag Nr. 19 anschauen. Damit l„át sich eine automatische Initialisierung der beiden Floppy-Laufwerke einschalten. Man bleibt beim Wechsel von Laufwerken brigens auf dem Startlauf- werk, also dem Device, von dem mit "cd" auf ein anderes gesprungen wurde, im Startordner (das ist der Ordner, von dem aus "cd" angewandt worden ist). Mit dieser Eigenschaft befaát sich das letzte Beispiel. Man kann "cd" auch ohne Argument benutzen, man landet dann in dem Verzeichnis, von dem aus der Kommandointerpreter gestartet worden ist (vgl. dazu auch die Kommandos "on / off 12"). ALLGEMEINE BEFEHLE 10 BEISPIELE: cd subdir Wechselt vom aktuellen Verzeichnis in das Unterverzeichnis 'subdir'. cd a:bingo Wechselt das Laufwerk, vom aktuellen Laufwerk auf Laufwerk A, und geht dort in den Ordner 'bingo'. cd .. Vom aktuellen Unterverzeichnis wird in das Verzeichnis gegangen, daá sich eine Ebene ber dem Unterverzeichnis befindet. Verh„lt sich also analog zu einem Anklicken der oberen linken Fensterecke unter GEM. cd ..\bingo Es wird zuerst eine Verzeichnisebene nach oben gesprungen, dann wird zum Ordner 'bingo' gegangen. Man kann sich brigens durch mehrmalige Angabe von '..' immer weiter zurck in Richtung Wurzelverzeichnis (oberster Ordner, also z.B. 'c:\' wenn man sich auf Laufwerk C befin- det) zurckhangeln. Angenommen man befindet sich im Verzeichnis '\a\b\c\d', nach Aus- fhrung von cd ..\.. findet man sich im Directory '\a\b' wieder. cd \ Wechselt in das Wurzelverzeichnis des aktuellen Laufwerks. cd d: Wechselt nur das Laufwerk. Die Eingabe von 'd:' bewirkt brigens das gleiche (s.u.). cd a:\dir1\dir2 Wechselt vom aktuellen Laufwerk auf A und geht dort in das Unterver- zeichnis 'dir2'. Nun noch ein Beispiel um die Erkl„rung von Startlaufwerk bzw. -ordner zu verdeutlichen: Angenommen man befindet im Verzeichnis 'd:\bingo\'. Durch die Eingabe von cd a:\dir1\dir2 kommt man auf A in das Unterverzeichnis 'dir2'. Wird jetzt dort cd d: eingegeben, befindet man sich wieder im Ordner 'd:\bingo\', d.h. der ALLGEMEINE BEFEHLE 11 Wechsel von Laufwerk zu Laufwerk verursacht auf dem Startlaufwerk keinen Sprung ins Wurzelverzeichnis '\'! Man sollte sich diese kleine Eigenart bei der Verwendung von Befehlen wie "cp" oder "cmp" merken. Werden dort beim Ansprechen von verschie- denen Laufwerken keine expliziten Pfadangaben gemacht, wird immer mit dem Verzeichnis gearbeitet, das vor Wechsel auf ein anderes Laufwerk aktuell war! -> cls ------ (kompletter Name: clear screen) Es wird mit diesem Befehl nur der Bildschirm gel”scht. Eine m”gliche Verwendung findet sich in Batch-Dateien. -> cmp [-b] [fileB] ------------------------------------------ (kompletter Name: compare) Vergleicht den Inhalt zweier Files miteinander. Ist dieser gleich, wird nichts zurckgemeldet, ansonsten ein frohes 'files differ' und die Position innerhalb der Datei, zu der man ggf. eins hinzuz„hlen muá (es wird n„mlich wortweise verglichen). Eine unterschiedliche Dateigr”áe wird, falls vorher nicht schon ein Abbruch wegen einer Differenz erfolgt ist, mit der Meldung 'file size different' belohnt. Es ist bei diesem Befehl m”glich, Wildcards zu benutzen sowie sich auf andere Laufwerke und andere Ordner zu beziehen. Durch die Verwendung von Kommas im ersten Argument, kann man mehrere Vergleichsanweisungen zusammenfassen. Ein korrekter Ausdruck fr ein solches Argument w„re beispielsweise 'a.dat,b.dat,c.dat'. Dieser Ausdruck bedeutet, daá zuerst 'a.dat', dann 'b.dat' und letztendlich 'c.dat' mit File 'fileB' verglichen wrden. Wem es ab und zu schon passiert ist, daá ein scheinbar korrekt abgelaufener Kopiervorgang doch nicht so recht funktionierte, wird diesen Befehl zu sch„tzen wissen. Das Weglassen des zweiten Arguments entspricht brigens der Eingabe '*.*'. Option | Bedeutung -------+------------------------------------------------------------ b | Abbrechen des Kommandos, wenn ein Unterschied gefunden | worden ist. | BEISPIELE: cmp c:command.txt a:command.txt Vergleich der beiden Dateien, die sich auf unterschiedlichen Laufwer- ken befinden. Da keine Pfadangaben vorhanden sind, werden die beiden Dateien im aktuellen Verzeichnis der beiden Laufwerke gesucht (vgl. dazu auch die Ausfhrungen zu "cd")! ALLGEMEINE BEFEHLE 12 cmp command.txt command.txt Dieser Befehl wird nicht ausgefhrt, da davon auszugehen ist, daá es sich um ein und denselben File handelt. cmp c:\duplikat\*.c *.c Vergleich aller 'C'-Dateien auf Laufwerk C im Verzeichnis 'duplikat' mit den 'C'-Dateien im aktuellen Ordner. cmp a:*.c,b:*.o Dieser Befehl ist die Kurzform fr die Befehlsfolge cmp a:*.c *.* cmp b:*.o *.* Es wird also von der abkrzenden Schreibweise, die durch die Verwen- dung von Kommas gegeben ist und vom Weglassen des zweiten Arguments Gebrauch gemacht. -> cp [-imnopqtv] [fileB] ------------------------------------------------ (kompletter Name: copy) Dieser Befehl wird zum Kopieren von Dateien benutzt. 'fileA' wird dabei in 'fileB' kopiert. Der Befehl ist so ausgelegt, daá in weitem Umfang auf andere Laufwer- ke und Verzeichnisse zugegriffen werden kann. Die Verwendung von Wildcards bietet ein zus„tzliches Maá an Flexibilit„t. Sicherheitshalber sollte beim Kopieren in oder aus Verzeichnissen der vollst„ndige Pfad angegeben werden! Wird nur ein Argument angegeben, so ersetzt das Programm das zweite durch '*.*'. Man erkennt vielleicht, daá beim ersten Argument die Verwendung von Kommas zul„ssig ist. Damit lassen sich mehrere Kopieranweisungen zu einer zusammenfassen. Macht man von dieser M”glichkeit Gebrauch, muá man beachten, daá zur Unterteilung nur das ','-Zeichen erlaubt ist! Ein zul„ssiger Ausdruck w„re also z.B. '*.c,*.o,xyz.prg'. Anhand eines der weiter unten folgenden Beispiele, wird der Sinn dieser Einrichtung wohl etwas klarer. Im Wandel der Interpreterversionen, hat sich das Verhalten von "cp" bezglich den Zieldateien bei Auftreten eines Fehlers ge„ndert. Im Gegensatz zu frher wird diese Datei in einem solchen Fall jetzt gel”scht. Da ja ein Fehlerfall eintrat, ist sie sowieso nicht kor- rekt. Es gibt eine M”glichkeit, das Kopieren etwas zu beschleunigen. Man muá dazu mit "on 14" ein Flag setzen (vgl. auch "flags"). Es wird dann nicht mehr der beim Programmstart reservierte Zeichenpuffer zum Kopieren verwendet (bzw. ein dynamischer Puffer, der intern allokiert wird), sondern der maximale freie Speicher reserviert. Von dieser Option sollte man allerdings nur Gebrauch machen, wenn man im Besitz des TOS-Patches ist, der sich mit dem 'Malloc()'-Problemchen befaát oder eine bereinigte Betriebssystemvariante verwendet! Den Patch kann man sich brigens via PD oder Mailbox oder Kollegen oder ... besor- gen. Defaultm„áig ist dieses Flag rckgesetzt. ALLGEMEINE BEFEHLE 13 Vor dem Start des eigentlichen Kopiervorgangs wird abgeprft, ob die Gr”áe des vorhandenen freien RAM-Speichers kleiner als der festange- legte Puffer ist. In diesem Fall wird dieses 'fast copy'-Flag, so es gesetzt war, gel”scht und mit dem normalen Puffer kopiert. Ich m”chte an dieser Stelle aber eine kleine Warnung loswerden. Vergleicht man von Zeit zu Zeit mit dem "free"-Kommando den gr”áten zur Verfgung stehenden freien Speicherblock des TOS', so kann es sein, daá dieser Wert immer kleiner wird. Dieser freie Bereich scheint im Laufe der Zeit, aus was fr Grnden auch immer, in kleinere Segmente zu zerfallen. Der Verdacht liegt nahe, daá der Patch vielleicht doch noch nicht der Weisheit letzter Schluá ist. Ich selber habe diese Beobachtung nach intensivem Hin- und Hergespringe zwischen Editor- und Compilerl„ufen gemacht, gehe aber mal davon aus, daá diese Zersplitterung auch beim Arbeiten mit anderen Anwendungen auftreten kann. Option | Bedeutung -------+------------------------------------------------------------ i | Anfrage, ob eine bereits bestehende Datei berschrieben | werden soll. | m | Nach dem Kopiervorgang wird die Quelldatei gel”scht. Diese | Option entspricht also in etwa "mv", nur daá man diesmal | auch mit verschiedenen Laufwerken arbeiten kann und im- | mer ein Kopiervorgang vorgenommen wird! | n | Bestehende Dateien werden nicht berschrieben. Es wird ein- | fach bei der n„chsten weitergemacht. | o | Bereits existierende Dateien werden umbenannt. Dazu wird die | Extension in eine dreistellige Zahl umgewandelt. Diese wird | bei bereits vergebenen Werten hochgez„hlt. | Die beiden Optionen 'i' und 'n' werden ignoriert. | Zu dieser Option sollte man sich den Befehl "purge" ansehen. | p | Dateiattribute werden auf Null gesetzt. Ist eigentlich nur | in Verbindung mit Option 'm' sinnvoll, da mit diesem Rck- | setzen auch das 'read-only'-Attribut verschwindet. | q | Beim Schreiben auf Disketten erfolgt kein Verify. | Von dieser Option sollte bei weniger gutem Diskettenmaterial | kein Gebrauch gemacht werden. | t | Keine šbernahme der Erstellungszeit beim Kopieren auf den | gleichen Dateinamen. | v | Es wird angezeigt welche Datei gerade in der Mache ist. | BEISPIELE: cp c:command.txt d:\subdir\*.* In diesem Beispiel wird der File 'command.txt' vom Hauptdirectory auf Laufwerk C in das Subdirectory 'subdir' auf Laufwerk D kopiert. ALLGEMEINE BEFEHLE 14 cp *.prg a: Kopiert alle PRG-Dateien des aktuellen Verzeichnisses auf Laufwerk A. cp -v *.* d:\allefiles\*.* Hier werden alle Files des aktuellen Ordners in das Directory 'allefiles' auf Laufwerk D kopiert. Durch '-v' kann man den ganzen Vorgang am Bildschirm verfolgen. cp c:xyz.dat Der File 'xyz.dat' wird vom Laufwerk C in das Verzeichnis kopiert, in dem man sich gerade befindet. Der Name der neuen Datei ist dabei auch wieder 'xyz.dat'. cp *.c,*.prg i: In diesem Beispiel soll noch einmal auf die Benutzung von ',' im ersten Argument eingegangen werden. Dieses Kommando kann man auch durch die folgenden zwei Befehle ersetzen: cp *.c i: cp *.prg i: Man sieht, daá die Unterteilung durch Kommas eigentlich nur zur Einsparung von Tipp-Arbeit gedacht ist. Statt der Angabe 'i:' h„tte man auch die ausfhrliche Versionen 'i:*.*' nehmen k”nnen. Der Interpreter fgt diese Wildcards automatisch an. Das folgende Beispiel soll in diesem Zusammenhang noch eine Anweisung zeigen, die weniger sinnvoll ist: cp a.txt,b.txt,c.txt d.txt Es finden hier drei Kopiervorg„nge statt, allerdings wird als Zielda- tei jedesmal 'd.txt' genommen, so daá bei Abschluá der Befehlbearbei- tung 'd.txt' dem Inhalt der Datei 'c.txt' entspricht. cp -n a:*.* b:*.* Hier werden alle Dateien, die sich im aktuellen Verzeichnis von Laufwerk A aber nicht im aktuellen Verzeichnis von B befinden, kopiert. -> crsoff --------- (kompletter Name: cursor off) Schaltet den Cursor aus. Dieses Kommando kann manchmal ganz brauchbar sein, wenn z.B. ange- zeigt werden soll, daá man sich in einer Batch-Datei befindet und keine Eingabe erwartet wird. ALLGEMEINE BEFEHLE 15 -> crson -------- (kompletter Name: cursor on) Schaltet den Cursor ein. -> date [-s] [dd.mm.yy] ----------------------- Ausgabe/Setzen des Datums. Wird kein Argument angegeben, erfolgt eine Ausgabe des Systemdatums, sonst bernimmt der Interpreter das Argument als neues Datum. Option | Bedeutung -------+------------------------------------------------------------ s | Die Ausgabe von '->date' unterbleibt. | BEISPIELE: date 1.5.88 Setzt das Systemdatum auf den 1. Mai 1988. date Hier wird nur das aktuelle Datum ausgegeben. -> defkey -------------------------- (kompletter Name: define key) Belegung der Funktionstasten mit einem Befehl, der bei Drcken dieser Tasten ausgefhrt wird. 'f-key' umfaát den Bereich von 1 bis 20 (na ja, es gibt halt nur zwanzig Funktionstasten wenn man bloá mit SHIFT arbeitet), wobei ab Nummer 11 die geshifteten Tasten gemeint sind, also wird z.B. Taste 14 duch SHIFT-F4 repr„sentiert. BEISPIELE: defkey 1 dir *.prg Jeder Druck auf fhrt jetzt zum Aufzeigen aller PRG-Dateien im aktuellen Verzeichnis. Die Hauptanwendung fr diese Funktion drfte allerdings im Aufrufen externer Programme mit bestimmten Parametern liegen: defkey 12 x.prg () fhrt nun zum Starten des Programms 'x.prg'. Jeder Druck auf eine definierte Funktionstaste fhrt unmittelbar zur Ausfhrung des zugeordneten Befehls, d.h. es wird nicht auf die -/-Taste gewartet! ALLGEMEINE BEFEHLE 16 -> delenv [-s] ---------------------------------------- (kompletter Name: delete environment variables) Entfernt eine Environment-Variable aus der Environment-Liste. Kommt eine solche Variable mehrmals in dieser Liste vor, wird jedes Auftreten entfernt. Es muá bei den Parametern kein '=' angeben werden. Dieses Zeichen wird vom Interpreter ggf. selbst„ndig angefgt. Groá- und Kleinschreibung muá allerdings mit dem zu l”schenden Eintrag bereinstimmen! N„here Ausfhrungen zu diesen Variablen und ihrer Bedeutung findet sich bei "appendenv". Option | Bedeutung -------+------------------------------------------------------------ s | Bei mehrmaligem Vorkommen einer Variablen, wird nur ein | Eintrag entfernt. | -> device --------- Ausgabe der angemeldeten Laufwerke. Auch wenn nur ein Floppylaufwerk vorhanden ist, werden die Laufwerke A und B immer angezeigt! -> df [-s] [device(s)] ---------------------- (kompletter Name: disk free) Dieses Kommando zeigt den freien Speicherplatz und die Clustervertei- lung des angegebenen Laufwerks an. Fehlt eine Laufwerksbezeichnung, wird das aktuelle genommen. Es k”nnen auch mehrere Laufwerke angege- ben werden. Gleichzeitig wird die Anzahl des verfgbaren Speichers in der Pro- grammvariablen "status" abgelegt. Auf die Bedeutung dieses Parameters gehe ich weiter unten noch ausfhrlicher ein. Option | Bedeutung -------+------------------------------------------------------------ s | Es erfolgt keine Bildschirmausgabe. Der Wert findet sich | nur im Parameter "status", | BEISPIELE: df a b c Der verfgbare Speicher von Laufwerk A - C wird ausgegeben. Laufwerke mssen immer in Buchstaben angegeben werden, auch wenn intern dann die Information via Laufwerksnummer geholt wird! Eine Laufwerksbezeichnung kann, um zu Befehlen wie z.B. "cd" eine gleiche Benennung zuzulassen, auch mit einem Doppelpunkt abgeschlos- ALLGEMEINE BEFEHLE 17 sen werden: df a: b: c: h„tte also die gleiche Wirkung wie das obige Beispiel. Eine gemischte Angabe, mal mit, mal ohne Doppelpunkt, ist auch zul„ssig. -> dir [-adimostu] [filedeskriptor(en)] --------------------------------------- (kompletter Name: directory) Sortiertes Aufzeigen von Ordnereintr„gen. Als Filedeskriptoren kan man auch Laufwerksbezeichnungen bzw. Ordner angeben. Wird kein Deskriptor angegeben, erfolgt eine Ausgabe aller Eintr„ge. Bei Angabe mehrerer Deskriptoren, werden sukzessive alle entsprechen- den Dateien aufgezeigt. Zus„tzlich zu den Filenamen erfolgt eine Ausgabe von Erstellungsda- tum, Gr”áe und Fileattribut. Die Attribute werden in abgekrzter Form, als Integerwert (in Klammern) und enstprechend den gesetzten/nicht gesetzten Bits ausgegeben. Die Attributabkrzungen und ihre Bedeutung: - rw = Read and Write (Bit 0) - ro = Read Only (Bit 0) - hi = HIdden (Bit 1) - sf = System File (Bit 2) - vl = Volume Label (Bit 3) - di = DIrectory (Bit 4) - wc = Written and Closed (Bit 5) Das zweimalig Vorkommen von Bit 0 heiát nichts anderes, als nicht gesetzt bei 'rw' und gesetzt bei 'ro'. Natrlich kann ein File mehrere Attribute haben (z.B. 'wc' und 'hi'). Es werden dann alle aufgefhrt. 'wc' l„uft auch unter der etwas weniger verf„nglichen Bezeichnung 'Archivbit'. Option | Bedeutung -------+------------------------------------------------------------ a | Auch '.' und '..' werden ausgegeben. | d | Es werden nur Ordner ausgegeben. | i | Die alphabetische Sortierung erfolgt in absteigender | Reihenfolge. | m | Einschalten der Warterei auf einen Tastendruck bei vollem | Bildschirm. | sorgt dann fr die Ausgabe einer weiteren Zeile, | fr einen kompletten Bildschirm, fr | eine halbe Bildschirmseite und fr den Abbruch | der Ausgabe. | o | Es wird in Abh„ngigkeit vom Erstellungsdatum sortiert. | s | Die Ausgabe wird nicht mehr nach Dateisorten getrennt ALLGEMEINE BEFEHLE 18 | durchgefhrt. | t | Die Ausgabe ist auf Eintr„ge mit Tagesdatum beschr„nkt. | u | Es wird nicht mehr sortiert. | BEISPIELE: dir Ausgabe aller Dateien des aktuellen Verzeichnisses. dir a: Ausgabe aller Files vom aktuellen Ordner auf Laufwerk A. dir *.prg a*.* Ausgabe aller PRG-Files und danach aller Dateien, die mit 'a' beginnen. dir \megamax\ Ausgabe aller Dateien im Verzeichnis 'megamax'. dir -m *.txt Ausgabe aller 'TXT'-Files. Sollte dabei der Bildschirm voll werden, wird am Bildschirmende '[MORE]' ausgegeben und auf das Drcken von /, bzw. der -Taste gewartet. -> echo [string] ---------------- Ausgabe von 'string' auf den Bildschirm. Wird kein String angegeben, erfolgt nur die Ausgabe einer Leerzeile. Sinnvoll ist dieses Kommando in Batch-Files. Ein Ausgabestring kann bestimmte Kontrollzeichen enthalten: %t = n„chste Tabulatorposition %n = Sprung zur n„chsten Zeile %% = das '%'-Zeichen %> = das '>'-Zeichen (vgl. Ausgabeumleitung) %< = das '<'-Zeichen (vgl. Eingabeumleitung) %r = Sprung zum Zeilenanfang %l = nach Ausgabe von 'string', keinen Zeilenvorschub ausfhren % = Anzahl von Leerzeichen ( geht von 0 bis 9!) % = zur Ausgabe eines bestimmten Zeichencodes. , und repr„sentieren dabei die Oktaldarstellung (Zahldarstellung zur Basis 8)! Da es diese M”glichkeit erlaubt, die -Sequenzen auszugeben, steht beispielsweise dem Setzen der Cursorposition nichts mehr im Wege. ALLGEMEINE BEFEHLE 19 Neben den folgenden Beispielen, findet sich bei der Beschreibung des "let"-Kommandos (im Abschnitt ber die Variablen) ein weiteres, daá sich mit dem eigenwilligen Verhalten von '%' in Verbindung mit dem "if"-Befehl auseinandersetzt! BEISPIELE: echo Na prima! Es wird 'Na prima!' ausgegeben. echo Ausgabe einer Leerzeile. echo %3abc%txyz Es werden erst drei Leerzeichen ausgegeben, dann 'abc' gefolgt von einem Sprung zur n„chsten Tabulatorposition, ab der dann die Zeichen- kette 'xyz' steht. echo %033pReverse Schrift%033q 'Reverse Schrift' wird genauso ausgegeben, da ja, wie natrlich jeder weiá, p fr Einschalten und q fr Auschalten dieser Darstellungsart sorgt (%033 ist dezimal 27 und repr„sentiert das -Zeichen). Folgen dem Prozentzeichen drei Ziffern, so werden diese immer als Oktalzahl interpretiert! -> env [string] --------------- (kompletter Name: environment) Dieses Kommando dient zum Anschauen/Setzen des Environment-Strings. Jedes externe Programm kann auf diesen String zugreifen, seine Adresse wird in der BASEPAGE abgelegt. Wird das Kommando ohne Argumente benutzt, erfolgt ein Aufzeigen der/des aktuellen Strings. BEISPIEL: env PATH=D:\ D:\EXTCOM Diese Eingabe setzt die Environmentvariable 'PATH' auf 'D:\' und 'D:\EXTCOM' (man sollte sich angew”hnen, Environment-Parameter groá zu schreiben). Wer weitergehende Informationen zur Bedeutung dieses Strings haben m”chte, sei zur Lektre der einschl„gigen Literatur aufgerufen (vgl. auch "appendenv" und "delenv"). Wer zu den Benutzern von SOZOBON-C, LATTICE-C oder GNU-C(++) z„hlt und keine Lust hat, mit einer graphischen Shell zu arbeiten, wird sich wahrscheinlich ber diesen Befehl freuen, da sich diese Compiler an Environment-Variablen orientieren k”nnen. ALLGEMEINE BEFEHLE 20 -> error -------- Dieses Kommando gibt entsprechend dem Inhalt der internen Variablen "status" eine Fehlermeldung aus (vgl. auch Kommando "status"). Diese Meldungen beziehen sich nur auf diejenigen, die im eigentlichen Interpreter 'command.prg' eingebaut sind. Die externen Kommandos besitzen zus„tzliche Fehlerausgaben, die von diesem Befehl nicht abgedeckt werden! -> exit ------- Verlassen des Interpreters und zurck zum Desktop. In „lteren Versionen des Programms gengte das einfache Bet„tigen von um den Interpreter zu verlassen. Dadurch ist es aber immer wieder zu Verwechslungen mit gekommen (und damit zu einem ungewollten Verlassen des Interpreters). hat keine Wirkung mehr! Leuten, denen das Eintippen von "exit" zuviel Arbeit macht, k”nnen ja eine Funktionstaste mit dem Kommando belegen. -> flags -------- Ausgabe diverser Programmflags. Zuordnung Ausgabestring <-> Kommando zum Setzen/Rcksetzen des Flags: Ausgabe: | on/off -----------------------+-------- "Errorbreak" | 2 "History" | 1 "Path change" | 3 "á = Beta" | 5 "Jump to '\'" | 12 "Show batch commands" | 13 "Save history" | 6 "Print title" | 7 "Expand TAB" | 4 "Convert slash" | 8 "Regard comments" | 11 "Expand file name" | 10 "Line numbers" | 9 "Fast copy" | 14 "Step through batch" | 15 "Help key" | 16 "ARGV valid" | 17 "Ý -> p-value" | 18 "init floppies A/B" | 19 "change screen" | 20 "error messages" | 21 | Bei diesen Flags wird durch '[ON]'/'[OFF]' angezeigt, ob die Funktion des entsprechenden Befehls aktiviert ist oder nicht. Die etwas lustige Reihenfolge bezieht sich auf die Bilschirmausgabe. Zus„tzlich wird angezeigt, welches Argument der "on" / "off"-Befehle ALLGEMEINE BEFEHLE 21 zu welchem Flag geh”rt. Alte Versionen von 'command.prg' liesen die Žnderung dieser Flags nur durch bestimmte Befehle zu (z.B. "text" / "notext"). Diese M”glich- keit gibt es nicht mehr! Benutzer, die sich nict an "on" / "off" gew”hnen k”nnen, seien auf den Abschnitt 'Die ALIAS-Einrichtung' verwiesen. Bedeutung der Flags: Flag | gibt an, -----+-------------------------------------------------------------- 1+ | ob die Historyfunktion aktiv ist oder nicht. Zu dieser Funk- | tion gibt es ein eigenes Kapitel. Ist dieses Flag nicht ge- | setzt, merkt sich der Interpreter keine Eingaben mehr. Man | kann allerdings noch auf die letzten 50, vor dem Rcksetzen | des Flags gemachten Eingaben zurckgreifen! 2+ | ob die Bearbeitung einer Batch-Datei abgebrochen werden soll, | wenn ein Fehler aufgetreten ist (l„át man am besten immer | gesetzt). 3+ | ob der beim Befehl "path" beschriebene Pfadwechsel bei 'PRG'/ | 'APP'-Dateien durchgefhrt werden soll. Dieser Wechsel wird | natrlich auch bei Dateien durchgefhrt, deren Extensions mit | "prgext" festgelegt worden sind. 4+ | ob bei einem Ausdruck unter Verwendung des "lp"-Kommandos | Tabulatorzeichen in die entsprechende Anzahl von Blanks um- | gewandelt werden soll. Die Tabulatorweite kann mit dem | Kommando "settab" festgelegt werden. Ist dieses Flag nicht | gesetzt, gilt der voreingestellte Wert des Druckers. 5+ | ob bei einem Ausdruck unter Verwendung des "lp"-Kommandos | statt einem 'á' der Code fr ein Beta an den Drucker geschickt | werden soll. Mein Drucker gibt z.B. statt 'á' ein Pesetenzei- | chen aus, und das wirkt doch etwas st”rend. 6+ | ob beim Verlassen des Interpreters eine Datei 'history.dat' | angelegt werden soll, die die letzten 50 eingegebenen Kom- | mandos enth„lt. Diese stehen via History-Einrichtung dem Be- | nutzer beim n„chsten Aufruf des Interpreters wieder zur Ver- | fgung. 7+ | ob bei einem Ausdruck eine Titelseite erstellt werden soll. | Diese enth„lt den Dateinamen und das aktuelle Datum. 8+ | ob das '/'-Zeichen in '\' umgewandelt werden soll. N„heres | dazu findet sich beim Kommando "cat". 9- | ob bei einem Ausdruck via "lp" Zeilennummern mit ausgegeben | werden sollen. 10+ | ob der Interpreter automatisch Dateinamen erweitern soll, | wenn diese nur teilweise eingegeben wurden. Das ist etwas fr | weniger tippbegeisterte Benutzer, kann allerdings zu Ver- | wechslungen fhren. Dieser Mechanismus bezieht sich nur auf | ausfhrbare Dateien! Die abkrzende Schreibweise bei Ordnern | bleibt erhalten und kann nicht abgeschaltet werden! 11+ | ob ';' in Batch-Dateien als Kommentarzeichen betrachtet werden | soll. Alle folgenden Zeichen werden dann ignoriert. Dieses | Zeichen hat brigens nur in diesen Dateien eine besondere | Bedeutung. Bei Direkteingabe ist ein Semikolon ein Semikolon | und sonst nichts, drfte also in den meisten F„llen zu einer | Fehlermeldung fhren! 12+ | ob bei Verwendung von "cd" ohne Argument, erst auf dem aktu- ALLGEMEINE BEFEHLE 22 | ellen Laufwerk ins Wurzelverzeichnis gegangen werden soll, | bevor der Befehl fr einen Sprung ins Startverzeichnis von | 'command.prg' sorgt. 13+ | ob jede Zeile, die gerade in einer Batch-Datei bearbeitet | wird, auf dem Bildschirm angezeigt werden soll. Ist manchmal | zur Fehlersuche ganz praktisch. 14- | ob beim Kopieren fr den Ein-/Ausgabepuffer aller frei ver- | fgbarer Speicher reserviert wird. Dazu sollte man sich | auf jeden Fall die Anmerkungen bezglich des Fehlers im TOS, | die beim Befehl "cp" gemacht werden, anschauen! 15- | ob Batch-Dateien im Single-Step-Betrieb abgeklappert werden | sollen. Ist dieses Flag gesetzt, wird ein Batch-File nur noch | zeilenweise abgearbeitet (dann warten auf Tastendruck durch | Benutzer). In der linken oberen Bildschirmecke wird die aktu- | elle Zeilennummer angezeigt. In Verbindung mit Flag 13 hat | man damit eine sehr gute M”glichkeit, Fehler in Batch-Da- | teien aufzuspren. 16+ | ob beim Drcken der -Taste alle verfgbaren internen | Kommandos ausgegeben werden sollen. Es handelt sich dabei | nur um eine einfache Befehls-Liste ohne n„here Beschreibung. 17- | ob ARGV-Verfahren eingeschaltet ist (vgl. dazu "appendenv" und | "env"). 18+ | ob in Batch-Dateien Variablen, denen ein 'Ý' vorangeht (Para- | graphenzeichen), durch deren Wert ersetzt werden. Dazu steht | im Abschnitt 'Batch-Processing' mehr. 19- | ob bei Wechseln mit "cd" oder bei Anwendung der Kommandos | "dir" bzw. "ls" auf die beiden Floppy-Laufwerke zuerst ein | Sprung ins Wurzelverzeichnis ('\') gemacht werden soll. Da- | mit werden die beiden Laufwerke zurckgesetzt und das beim | "cd"-Kommando beschriebene Problem tritt (hoffentlich) nicht | auf. Es ist zu beachten daá bei gesetztem Flag, ein Wechsel | auf diese Laufwerken immer von '\' ausgeht! 20+ | ob beim Aufruf eines 'PRG'/'APP'-Programms der Bildschirm in | das geschmackvolle DESKTOP-Grau getaucht werden soll. Bei den | vielen Graphik-Karten und -Modes, die es inzwischen gibt, | erschien es mir sinnvoll, diese Einf„rberei abschaltbar zu | halten. Ist dieses Flag nicht gesetzt, wird der Bildschirm | vor dem Aufruf der 'PRG'/'APP'-Datei nur gel”scht. | Dieser Vorgang gilt auch fr Dateien, deren Extension mit | "prgext" angegeben worden sind! 21+ | ob der Interpreter Fehlermeldungen ausgeben soll. M”chte | man in Batch-Dateien seine eigenen Meldungen ausgeben, | kann dieses Flag ganz ntzlich sein. Diese Abschaltung | gilt allerdings nicht fr die externen Kommandos! | Die Bedeutung einiger der Flags wird wohl erst nach Lektre der entsprechenden Abschnitte deutlich. Diese Zusammenstellung soll nur eine Gedankensttze darstellen, die ein schnelles Auffinden eines bestimmten Flags erm”glicht. Das '+' bzw. '-'-Zeichen nach jeder Flagnummer gibt die Voreinstel- lung beim Programmstart an. Diese kann man natrlich unter Verwendung von 'auto.com' seinen eigenen Wnschen anpassen (vgl. dazu Abschnitt ber Batchbearbeitung). Die folgende Auflistung zeigt die Verbindung von Kommandos, die SetUp ALLGEMEINE BEFEHLE 23 Funktion haben und ihre Repr„sentation in der Flag-Liste: "TAB" Befehl:settab "Lines per page" Befehl:lppage "Margin" Befehl:lpmargin "Start page" Befehl:page Die letzten drei Angaben beziehen sich auf Steuerzeichen die bei einer Druckerausgabe vor, nach und vor jeder neuen Seite an den Drucker geschickt werden (dieser muá dabei an der CENTRONICS-Schnitt- stelle h„ngen): "printer start sequence" "printer stop sequence" "new page sequence" Diese Steuerzeichen muá natrlich der Benutzer bestimmen! Die dafr zur Verfgung stehenden Kommandos sind "setlp", "resetlp" und "pagelp". -> free [-s] ------------ Gibt den noch verfgbaren RAM-Speicherplatz und den gr”áten noch existierenden freien Block im RAM aus. Der verfgbare Speicherplatz wird neben der direkten Ausgabe auch noch im Programmparameter "status" abgelegt. Mit dieser Variablen kann man z.B. den Ablauf von Batch-Dateien steuern. Im Abschnitt, der sich mit der ganzen Batch- Problematik auseinandersetzt, wird auch die Bedeutung von "status" ausfhrlich beleuchtet. Zur Bestimmung dieser beiden Werte werden die Betriebssystemfunktio- nen 'Malloc()' und 'Mfree()' benutzt, d.h. ohne den Patch, der dafr sorgt, daá diese beiden Dinger das tun, was man erwarten wrde, sollte man sich nicht zu sehr wundern, wenn es Žrger gibt. Der Patch ist, wie bereits beim "cp"-Kommando angesprochen, als PD verfgbar und sollte eigentlich auch bei den ATARI-H„ndlern rumgeistern. Option | Bedeutung -------+------------------------------------------------------------ s | Es findet keine Bildschirmausgabe statt. Der Wert findet | sich nur im Parameter "status". | '-s' hat noch einen anderen Nebeneffekt, Man umgeht damit das 'Malloc()'-Problem. Es ist also auch ohne den angesprochenen Patch m”glich, den verfgbaren Gesamtspeicher zu erhalten. -> help [command(s)] -------------------- Wird dieser Befehl ohne Argument(e) eingegeben oder einfach die -Taste gedrckt, erfolgt eine Auflistung aller verfgbaren Kommandos. Wird allerdings ein Argument (oder mehrere) angegeben, so erfolgt die Ausgabe einer zugeh”rigen Kurzbeschreibung. Diese Beschreibungen befinden sich in der Datei 'command.hlp', die sich immer in dem Verzeichnis befinden muá, von dem aus der Kommando- ALLGEMEINE BEFEHLE 24 interpreter aufgerufen wurde. Kann diese Hilfedatei nicht gefunden werden, st”át man auf eine entsprechende Fehlermeldung! Die Funktion der -Taste l„át sich brigens mit "on / off 16" ein- bzw. ausschalten (dies fr Leute wie mich, die immer wieder statt die -Taste erwischen). BEISPIELE: help dir rm Es werden die Kurzbeschreibungen zu den Kommandos "dir" und "rm" ausgegeben. help Es werden alle verfgbaren internen Kommandos ausgegeben. -> keys ------- Dieser Befehl sorgt fr eine Auflistung der aktuellen Funktionstas- tenbelegungen (vgl. dazu "defkey"). -> lp [-iprs] ----------------------- (kompletter Name: lineprinter) Soll eine ASCII-Datei (oder auch mehrere) auf einem Drucker ausgege- ben werden, geschieht dies vom Interpreter aus mit dem "lp"-Befehl. Hat man einen Druckerspooler in Betrieb, ist das eine recht nette Angelegenheit. Auáerdem gibt es bei Verwendung von "lp" keine Probleme mit TAB-Zei- chen, da sie korrekt expandiert werden (wenn gewnscht). Es ist auáerdem m”glich, eine Titelseite auszugeben und vor dem eigentlichen Ausdruck, nach dessen Abschluá und vor jeden neuen Seite, eine Steuersequenz an den Drucker zu schicken (vgl. auch "settab", "setlp", "pagelp" und "resetlp"). Option | Bedeutung -------+------------------------------------------------------------ i | Alle Einstellungen werden ignoriert. Entspricht einer Druk- | kerausgabe via Desktop. Die Angaben aus 'lpalpha.dat' be- | halten jedoch ihre Gltigkeit (s.u.)! | p | Keine Ausgabe der "pagelp"-Sequenz. | r | Keine Ausgabe der "resetlp"-Sequenz. | s | Keine Ausgabe der "setlp"-Sequenz. | Ein Stoppen des Druckvorgangs kann jederzeit mit ausge- l”st werden! Allerdings beinhaltet ein solcher Abbruch kein L”schen von Zeichen, die in irgendeinem Druckerpuffer verschwunden sind, d.h. je nach Gr”áe eines solchen Puffers, kann die Druckerei noch eine ganze Weile fr”hlich weitergehen. Zum ausschlieálichen Senden von Steuercodes m”chte ich auf das ALLGEMEINE BEFEHLE 25 externe Kommando "drucker" verweisen. Beim Start des Interpreters wird berprft, ob es eine Datei namens 'lpalpha.dat' gibt (im gleichen Verzeichnis wie der Interpreter). Diese kann zum Žndern von Zeichencodes benutzt werden. Pro Zeile mssen zwei Zahlen vorkommen, wobei die erste den eigentlichen Code des Zeichens repr„sentiert und die zweite den Code, der beim Auftreten eines solchen Zeichens an den Drucker geschickt wird. Es findet keine Plausibilit„tsberprfung o.„. statt. Nur Angaben fr den ursprnglichen Code, die im negativen Bereich oder gr”áer als 255 sind, werden ignoriert! Eine Datei kann z.B. folgendes Aussehen haben: 221 21 158 225 Die erste Zeile sorgt in diesem Beispiel dafr, daá beim Auftreten eines Paragraphenzeichens der Code 21 an den Drucker geschickt wird, die zweite fr das Senden von 225, wenn ein s-zet auftaucht. Die Auswertung dieser Datei wird abgebrochen, wenn das Fileende erreicht ist oder beim Auftreten einer Leerzeile! Es werden auáerdem nur die ersten zehn Zeichen einer Zeile betrachtet. Fhrende Leerzeichen werden dabei mitgez„hlt! Das Fehlen einer solchen Datei hat keine Auswirkungen. Beim Druckvorgang werden dann die normalen Zeichencodes an den Drucker geschickt. Fr l„ngere Zeichencodes sei auf die Verwendung des "trans"-Befehls verwiesen. BEISPIELE: lp command.txt Ausdruck der Datei 'command.txt'. lp *.c Ausdruck aller 'C'-Dateien. Die verschiedenen Steuersequenzen werden brigens vor bzw. nach jedem Dateiausdruck neu gesendet, d.h. hat man es z.B. mit drei 'C'-Files zu tun, werden die Steuercodes auch dreimal an den Drucker geschickt: "setlp"-Sequenz | 'C'-Datei 1 | "resetlp"-Sequenz | "setlp"-Sequenz | 'C'-Datei 2 | "resetlp"-Sequenz | "setlp"-Sequenz | 'C'-Datei 3 | "resetlp"-Sequenz ALLGEMEINE BEFEHLE 26 -> lpmargin [intvalue] ---------------------- (kompletter Name: lineprinter margin) Anzahl der Blanks, die bei einem Ausdruck vor der eigentlichen Zeile kommen. Fehlt das Argument, ist diese Funktion ausgeschaltet. -> lppage [intvalue] -------------------- (kompletter Name: lineprinter page) Anzahl der Zeilen pro Seite bei einem Ausdruck. Wird kein Argument angegeben, ist diese Funktion ausgeschaltet. Bei eingeschalteter Funktion, wird jeweils nach Erreichen der Zeilenzahl die durch "pagelp" festgelegt Codesequenz an den Drucker geschickt. -> ls [-admt] [filedeskriptor(en)] ---------------------------------- (kompletter Name: list short) Dieser Befehl ist eine Abart von "dir" (man k”nnte auch sagen, der kleine Bruder). Dort wird eine ausfhrliche Informationsfolge zu jedem File ausgegeben. Dies unterbleibt bei "ls". Hier werden nur die Datei- bzw. Ordnernamen aufgelistet. Die Dateien werden auáerdem nicht sortiert ausgegeben, sondern in der Eintragsreihenfolge. Option | Bedeutung -------+------------------------------------------------------------ a | Auch die beiden Eintr„ge '.' und '..' werden ausgegeben. | d | Nur Ordner werden ausgegeben. | m | Warten bei vollem Bidschirm ist eingeschaltet. | t | Ausgabe ist auf Eintr„ge mit Tagesdatum beschr„nkt | BEISPIEL: ls *.txt Ausgabe aller Dateien mit einer 'TXT'-Extension. -> mkdir [-q] -------------------------- (kompletter Name: make directory) Dieser Befehl erzeugt einen neuen Ordner. Man sollte allerdings nicht vergessen, daá nur eine bestimmte Verzeichnistiefe zul„ssig ist. Auch das '40-Ordner-Problem' muá man im Auge behalten (bei alten TOS- Versionen, bzw. wenn man kein Gegenmittel hat). Nach der Generierung des neuen Verzeichnisses, findet man dort bereits zwei Eintr„ge, n„mlich '..' und '.'. '.' stellt einen ALLGEMEINE BEFEHLE 27 Verweis auf den Ordner dar in dem man sich befindet, '..' ist ein Verweis auf das darberliegende Verzeichnis (vgl auch "cd .."). Option | Bedeutung -------+------------------------------------------------------------ q | Bei der Erzeugung von Ordner auf Disketten findet kein | Verify statt. Das beschleunigt den ganzen Vorgang, sollte | allerdings nur bei gutem Diskettenmaterial gemacht werden! | BEISPIELE: mkdir schrott Es wird im aktuellen Directory das neue Unterverzeichnis 'schrott' eingerichtet. Mit "cd schrott" und "dir -a" kann man anschauen, welche Dateien dabei erzeugt worden sind ('.' und '..', welche sonst?). mkdir c:ordner1\ordner2 Existiert auf Laufwerk C keiner der beiden Ordner, werden diese angelegt. 'ordner2' ist dabei ein Unterverzeichnis von 'ordner1'. Ist hingegegen 'ordner1' bereits vorhanden, wird nur noch 'ordner2' als Subdirectory angelegt. Wie man an diesem Beispiel sieht, kann man mit "mkdir" ganze Unter- verzeichnisfolgen auf einmal anlegen. -> more [-s] ---------------------- Žhnlich dem "cat"-Kommando k”nnen mit diesem Befehl eine oder mehrere ASCII-Dateiinhalte auf den Bildschirm ausgegeben werden. Der Unter- schied zu "cat" liegt darin, daá immer nur eine Bildschirmseite ausgegeben wird. Dann wird angehalten und auf das Drcken der -Taste, oder gewartet. Wird bet„tigt, erfolgt die Ausgabe einer neuen Seite, bei wird zeilenweise fortgefahren. gibt eine halbe Seite aus. Die Ausgabe kann jederzeit mit abgebrochen werden. Das Kommando erlaubt den Zugriff auf Dateien, die sich in anderen Ordnern / auf anderen Laufwerken befinden. Option | Bedeutung -------+------------------------------------------------------------ s | Es unterbleibt die Ausgabe des Dateinamens und das Warten | zwischen zwei Fileausgaben. | Man sollte den Befehl brigens auf Textdateien beschr„nken, andern- falls kann es zu einer etwas unsch”nen Ausgabeverklemmung kommen! Zu diesem Kommando gibt es unter den externen Kommandos noch ein Pendant namens "emore" mit wesentlichen Erweiterungen. ALLGEMEINE BEFEHLE 28 BEISPIELE: more *.pas Es werden s„mtliche Pascalsourcefiles ausgegeben (ich gehe dabei davon aus, daá die Extension 'PAS' sich auf PASCAL bezieht). more c:/duplikat/com.c Ausgabe des Files 'com.c' der sich auf Laufwerk C im Verzeichnis '/duplikat/' befindet. -> mouseoff ----------- Der Sinn dieses und des n„chsten Befehls mag auf den ersten Blick nicht so recht einleuchten. Ich hoffe aber, daá seine Daseinsberech- tigung durch diese Ausfhrungen, bzw. wenn man erstmal selber auf das Problemchen gestoáen ist, daá zu seiner Implementierung gefhrt hat, klar wird. Das Kommando schaltet den Mauszeiger aus. Normalerweise ist dieser im Interpreter sowieso nicht sichtbar. Es gibt aber Programme, die diesen Zeiger sehr wohl benutzen, und h„ngt sich nun solch ein Programm auf, kann es unter Umst„nden zu einem herrlichen Durcheinander mit der Maus kommen. Wird z.B. ein Programm mit der Extension 'PRG' aufgerufen, schaltet der Interpreter automatisch den Mauszeiger vor dem Programmaufruf ein. Schaltet dieses Programm nun diesen Zeiger wieder aus und ihn auch bei Erreichen des Programmendes nicht wieder ein (wie es gentlemanlike w„re), so gibt es Probleme, da der Interpreter nach dem Lauf des Programms den Zeiger abschaltet, und zwar unabh„ngig davon, ob er ein- oder ausgeschaltet war. Ich nehme mal an, daá die Problematik bis jetzt noch nicht so ganz einleuchtet, schlieálich will man ja, daá der Mauszeiger verschwin- det. Leider ist das GEM aber so organisiert, daá es sich merkt, wie oft der Zeiger ausgeschaltet worden ist, d.h. wird er zweimal ausgeschaltet, muá er, um wieder sichtbar zu werden, auch wieder zweimal eingeschaltet werden. Der Interpreter hat nun aber keine Ahnung, wie oft der Zeiger ausgeschaltet wurde, denn schlieálich ist er ja ein biáchen dumm. Der Benutzer sollte nun selbst fr eine Korrektur des Problems sorgen, denn der ist ja nicht so dumm. Dies ist notwendig, wenn mit Anwendungen gearbeitet wird, die den Mauszei- ger verwenden. Es kann sonst passieren, daá in einem solchen Pro- gramm, in dem die Maus gebraucht wird (z.B. ein GEM-Editor), keine auftaucht. Es macht nicht viel Spaá, jetzt wie ein blindes Huhn herumzuirren, bis man wieder aus dem Programm rauskommt (wenn man nicht lieber gleich RESET drckt). Man sollte also, falls das angesprochene Problem aufgetaucht ist, solange den Mauszeiger anschalten ("mouseon"), bis er wieder sichtbar ist. Dann gibt man einmal "mouseoff" ein und die Welt ist wieder in Ordnung. Normalerweise reicht es brigens zweimal "mouseon" einzuge- ben. Der Aufwand bleibt also in einem vertretbaren Rahmen. ALLGEMEINE BEFEHLE 29 -> mouseon ---------- Dieser Befehl schaltet den Mauszeiger ein. -> mv [-v] -------------------------- (kompletter Name: move) Zum Umbenennen eines Files wird dieses Kommando zur Verfgung gestellt. Aus 'fileA ' wird 'fileB'. Option | Bedeutung -------+------------------------------------------------------------ v | Ausgabe der Dateinamen, die gerade bearbeitet werden. | Dieser Befehl kann mit Wildcards benutzt werden. Man sollte aller- dings ein biáchen aufpassen, da die M”glichkeiten zum Unsinn anstel- len nicht zu verachten sind. Noch ein Wort zur Funktionsweise, ein Umbenennen ist nicht gleichzu- setzen mit einem Kopieren und L”schen der alten Datei. Es findet nur eine Žnderung der internen Information des TOS zum entsprechenden File statt. BEISPIELE: mv oldie.dat uroldie.dat Der File 'oldie.dat' wird in den File 'uroldie.dat' umbenannt. mv c:\xydir\xyz.dat c:\xyz.dat Wie man sieht, ist es m”glich Dateien von einem Ordner in einen anderen zu verschieben. Man kann sich damit einiges an Kopier- / L”scharbeit ersparen. Zu beachten ist allerdings, daá die Datei aus dem ursprnglichen Verzeichnis verschwindet! Auáerdem gilt diese M”glichkeit auch nur innerhalb eines Laufwerks, d.h. man kann damit z.B. keine Datei von Laufwerk A auf Laufwerk D bringen. Hier muá mit "cp -m" gearbeitet werden, d.h. mv a:testdat.a b:testdat.a fhrt zu einer Fehlermeldung. -> off ---------------- Ausschalten eines bestimmten Flags (vgl. auch "on" und "flags"). Die Flags und ihre zugeh”rigen Nummern: 1 = History-Mechanismus einschalten 2 = Abbruch einer Batchbearbeitung im Fehlerfall 3 = Verwendung des unter "path" an- gegebenen Suchpfads 4 = statt TABs Blanks an Drucker schicken ALLGEMEINE BEFEHLE 30 5 = á -> Beta beim Drucken 6 = 'history.dat' abspeichern 7 = Titelseite beim Drucken 8 = '/' -> '\'-Umwandlung 9 = Zeilennummerierung in Listings 10 = Namenserweiterung 11 = Kommentare in Batch-Dateien 12 = vor Sprung in Home Directory springe in Wurzelverzeichnis 13 = Ausgabe des aktuellen Befehls in der aufgerufenen Batch-Datei 14 = bei Schreiben auf Diskette kein Verify 15 = Batch-Dateien im Einzelschritt- Modus bearbeiten 16 = -Taste aktiv 17 = ARGV-Argumentbergabe an Programme 18 = Ý durch Variablenwert ersetzen 19 = Initialisierung von Floppy-Laufwerken 20 = bei Aufruf von 'APP'- / 'PRG'-Anwen- dungen, Bildschirm einf„rben 21 = keine Fehlermeldungen des Interpre- ters mehr Eine Kurzzusammenfassung der Bedeutung findet sich in der Beschrei- bung zum "flags"-Kommando. -> on --------------- Setzen eines bestimmten Flags (vgl. auch "off" und "flags"). Die Zuordnung Nummer <-> Flag findet sich bei "off". -> page [intvalue] ------------------ Ist diese Funktion eingeschaltet, wird am Seitenanfang bei einem Ausdruck der Filename und die aktuelle Seitennummer ausgegeben. Das Argument gibt die Startseitennummer an. Bei fehlendem Argument ist die Funktion ausgeschaltet. Mit Hilfe von "flags" kann man sich ber die gerade gltige Einstel- lung informieren. -> pagelp [intvalue(s)] ----------------------- (kompletter Name: page lineprinter) Festlegen einer Codesequenz, die bei Erreichen eines Seitenendes an den Drucker geschickt wird, z.B. w„re 12 gleichbedeutend mit einem 'formfeed'-Zeichen (vgl. dazu auch "lppage", "setlp" und "resetlp"). Fehlt das Argument, erfolgt keine Sequenzausgabe an den Drucker. Dieser Befehl wurde eingebaut, um auch Benutzer von Druckern mit automatischen Einzelblatteinzgen, oder Exoten, die nur auf eine bestimmtes Kommando hin einen Blattvorschub ausl”sen, zufriedenzu- stellen. Es k”nnen brigens bis zu 35 solcher Steuerzeichen (in dezimaler ALLGEMEINE BEFEHLE 31 Form) angegeben werden. Eine šberlaufkontrolle findet nicht statt! BEISPIEL: pagelp 12 Setzt das bereits angesprochene 'formfeed'-Zeichen. -> path [-ace] [pfad(e)] ------------------------ Angabe eines bzw. mehrerer Pfade, die zum Auffinden eines Programmes durchsucht werden sollen. Es k”nnen maximal zwanzig Pfade gesetzt werden. Programmnamen mssen nicht unbedingt komplett angegeben werden, sie werden, je nach Benutzerwunsch, automatisch expandiert (vgl. dazu auch "on 10"). Pfadnamen mssen als letztes Zeichen entweder '/' oder '\' enthalten (wird allerdings vom Interpreter angefgt, wenn es fehlt). Dies gilt auch, wenn es sich nur um Laufwerksnamen handelt (z.B. "path a:\ c:\"), dann wird dort allerdings nur im Hauptver- zeichnis gesucht. Option | Bedeutung -------+------------------------------------------------------------ a | Neue Pfadangaben an bereits bestehende anh„ngen. | c | L”schen s„mtlicher Pfadangaben (keine Argumente erlaubt). | e | Es werden die Pade der Environment-Variablen 'PATH' ber- | nommen (keine Argumente erlaubt). Eine Kombination mit | Option 'c' ist zul„ssig. | Es wird nur das erste Vorkommen von 'PATH' bercksichtigt! | Bei Programmen mit den Endungen 'PRG' und 'APP' wird vor dem Start in das jeweiligen Verzeichnis gesprungen, in dem sie sich befinden. Ich sollte vielleicht den Grund fr diesen Ordnerwechsel nennen: Ich benutze einen bestimmten Ordner zur Aufbewahrung von Tool-Pro- grammen, die mehr oder weniger alle die Endungen 'TTP' und 'TOS' haben. Nehme ich nun diesen Ordner in die zu durchsuchenden Pfade auf, wird zwar bei Auffinden des Programms in den Ordner gesprungen, aber die Argumente (in der Hauptsache Files) befinden sich halt nicht dort, also funktioniert das ganze nicht. Da die meisten Benutzer GEM- Anwendungen mit den Endungen 'PRG' und 'APP' am Laufen haben, die z.B. 'RSC'-Dateien nachladen, die aber bei Unterbleiben dieses Sprungs nicht gefunden werden wrden, wird man die Notwendigkeit des Ordnerwechselns bei diesen Programmtypen hoffentlich einsehen. Programme, wie beispielsweise TEMPUS, die mit der Endung 'PRG' durchs Leben gehen, aber keine weiteren Dateien nachladen, mssen explizit durch Angabe eines entsprechenden Pfades aufgerufen werden (wenn der Ordnerwechsel st”ren wrde und deshalb nicht erwnscht ist). Befindet sich TEMPUS z.B. im Verzeichnis 'd:\extcom\', hat ein Aufruf, der keinen Wechsel bewirkt, folgendermaáen auszusehen: d:\extcom\tempus Wem das zu umst„ndlich ist, sei auf den Abschnitt, der sich mit dem ALLGEMEINE BEFEHLE 32 Setzen eines Alias' auseinandersetzt, verwiesen. Selbstverst„ndlich kann der automatische Sprung in den zu durchsu- chenden Ordner auch abgeschaltet werden (vgl. "on / off 3"). Man sollte vielleicht noch beachten, daá mit der Anzahl der zu durchsuchenden Verzeichnisse auch die Zeit bis zur Auffindung bzw. bis zur Meldung, daá ein Programm nicht gefunden werden kann, steigt! Die Suche nach einem Programm geschieht in folgender Reihenfolge: 1. wenn ALIAS-Eintrag, dann Umwandlung 2. wenn mit Pfadangabe, dann Ausfhrung 3. wenn in aktuellem Verzeichnis, dann Ausfhrung 4. die mit "path" festgelegten Wege absuchen und ggf. Ausfhr- ung, es wird dabei die Argumentfolge in Reihe abgesucht! Da ich kein rechtes Vertrauen in die F„higkeiten des TOS habe, exi- stiert beim Wechseln der Pfade ein Kontrollmechanismus, der bei einem fehlerhaften Ordneransprung eine Warnung ausgibt. Dies sollte eigent- lich nie der Fall sein, aber man soll nie nie sagen was das TOS betrifft. BEISPIELE: path \erste\ a:\ c:\oben\unten\ Ein externes Programm wrde in diesem Fall erst im aktuellen Ver- zeichnis gesucht werden. Kann es dort nicht gefunden werden, wird versucht, es im Ordner '\erste\' zu finden. Ist es auch dort nicht vorhanden, wird zum Hauptverzeichnis auf Laufwerk A gegangen. Bei einem weiteren Fehlschlag wird nun noch auf Laufwerk C im Directory '\oben\unten\' gesucht. path Ohne Argumente und Optionen werden nur die gesetzten Suchpfade ausgegeben. path -ce L”schen bereits gesetzter Pfade und šbernahme der Werte vom Environ- ment-Parameter 'PATH'. path a:\;b:\;d:\xyz Die einzelnen Pfade k”nnen nicht nur durch Leerzeichen getrennt sein, ';' und ',' haben die gleiche Wirkung! -> prgext [extension(s)] ------------------------ (kompletter Name: program file extension) Normalerweise faát der Interpreter alle Dateien mit den Endungen 'APP' oder 'PRG` als Programm-Files auf, bei deren Aufruf der Bildschirm einzuf„rben und die Maus einzuschalten ist. "prgext" erm”glicht es nun dem Benutzer beliebige Dateierweiterungen angeben zu k”nnen, die dann als Programm-Dateien erkannt werden. Besonders interessant ist dies in Verbindung mit Programmen, die zur Verhinderung von Link-Viren die g„ngigen Extensions ab„ndern. ALLGEMEINE BEFEHLE 33 Unterbleib die Angaben eines Arguments, werden die gerade gesetzten Erweiterungen ausgegeben. Der analoge Befehl fr TOS-Dateien findet sich in "tosext". -> prompt [string] ------------------ Kommando zur Žnderung des Prompts. Voreingestellt ist die Ausgabe der Kommandonummer und eines '>'-Zeichens (entspricht: '%1>'). Es gibt folgende Ausgabem”glichkeiten: %1 = Kommandonummer %2 = aktueller Ordner %3 = aktuelles Laufwerk %% = '%' oder jede andere Zeichenfolge Mit "flags" kann die gltige Ausgabeanweisung fr den Prompt ber- prft werden. BEISPIELE: prompt %3%2: '%3%2:' fhrt zur Ausgabe des aktuellen Laufwerks, des aktuellen Ordners und fgt schlieálich an das ganze noch ein ':'-Zeichen an. Angenommen man befindet sich auf Laufwerk A im Directory SUBDIR so erhielte man 'A:\SUBDIR\:' als Prompt. prompt mein prompt> Hier wird immer 'mein prompt>' ausgegeben. -> pwd [-s] ----------- (kompletter Name: print working directory) Dieser Befehl zeigt den aktuellen Pfad an, in dem man sich gerade befindet. Option | Bedeutung -------+------------------------------------------------------------ s | Es unterbleibt die Ausgabe von '->path'. | -> reset [-c] ------------- Der Rechner fhrt einen Reset aus. Da dieser Reset kein Kaltstart ist (auáer bei gesetzter Option 'c'), sondern dem Drcken der RESET-Taste bzw der Tastenkombination - - entspricht, wird unter Umst„nden nicht der gesamte von 'command.prg' verbratene Speicher zurckgeholt! Mit anderen Worten, ein h„ufiges Verwenden kann zu akutem Speicherschwund fhren. Das Problem l„át sich allerdings durch einen Kaltstart beheben. ALLGEMEINE BEFEHLE 34 Option | Bedeutung -------+------------------------------------------------------------ c | Kaltstart durchfhren. | -> resetlp [intvalue(s)] ------------------------ (kompletter Name: reset lineprinter) Dieser Befehl wurde bereits beim "lp"-Kommando erw„hnt. Benutzt man "lp" zum Ausdruck von Dateien, wird vor oder nach dem eigentlichen Druckvorgang eine Steuersequenz an den Drucker geschickt (z.B. Schriftgr”áe oder ein Initialisierungskommando). "resetlp" ist nun fr die Sequenz zust„ndig, die nach dem Ausdruck an den Drucker geschickt wird. M”chte der Benutzer, daá keine solche Folge geschickt wird (Defaulteinstellung), muá er einfach "resetlp" ohne Argument eingeben. Eine andere Art der Unterdrckung findet sich in der Benutzung der entsprechenden Optionen beim "lp"-Befehl. Mit "flags" kann man sich die aktuell gltige Steuersequenz anschau- en. šbrigens werden diese Steuerzeichen nur bei Verwendung von "lp" an den Drucker geschickt. Bei einer Ausgabeumleitung via '>PRN:' unter- bleibt dies! BEISPIEL: resetlp 12 28 64 Diese Sequenz sorgt nach Abschluá eines Ausdrucks fr einen Seiten- vorschub und der Umschaltung auf die Grundeinstellung eines NEC-P6- Druckers. -> rm [-ehipvw] ------------------------- (kompletter Name: remove) Beim L”schen von Dateien findet dieser Befehl Verwendung. Es k”nnen damit sowohl ganze Filegruppen als auch nur bestimmte Einzeldateien entfernt werden (Verwendung von Wildcards ist zugelassen). Man sollte bei Benutzung des Kommandos ein biáchen aufpassen, sonst l”scht man Dateien, die man eigentlich noch braucht. Der Befehl erlaubt den Zugriff auf andere Verzeichnisse und Lauf- werke. Option | Bedeutung -------+------------------------------------------------------------ e | Auf Fehler wird nicht reagiert, d.h. keine Meldung oder Ab- | bruch. | h | Dateien mit gesetztem 'hidden'-Attribut werden nicht ent- | fernt. | i | Sicherheitsabfrage des Benutzers vor jedem L”schvorgang. | Ein Drcken von bewirkt den Abbruch der Aus- | fhrung. | p | Auch Dateien mit dem 'read-only'-Attribut werden gel”scht. ALLGEMEINE BEFEHLE 35 | v | Anzeigen, welche Datei gerade entfernt wird. | w | Vor dem eigentlichen L”schvorgang wird die Datei mit Nullen | berschrieben. | Ist man an einer etwas brutaleren Dateientfernung interessiert, sollte man sich einmal die Befehle "quickdel", "wipeout", "erasef" und "erases" anschauen (deren Beschreibung findet sich im Abschnitt ber die externen Kommandos). Jetzt m”chte ich noch einen kleinen zus„tzlichen Gag erw„hnen, der in "rm" eingebaut ist, 'file(s)' beginnend und endend mit '"' bzw. '''. In so einem Fall wird nicht nach Wildcards geschaut, sondern direkt die TOS-Funktion direkt mit dem in Anfhrungszeichen eingeschlossenen Argument aufgerufen. Das kann z.B. dann sinnvoll sein, wenn ein Dateiname Doppelpunkte o.„. enth„lt. Normalerweise wrde dann von einer Laufwerksangabe ausgegangen werden. Es wird bei einem solchen Argument nicht auf Fehler reagiert! Man muá sich also selber davon berzeugen, ob das gewnschte Ergebnis erzielt worden ist. Auch eventuell gesetzte Optionen haben keine Wirkung! BEISPIELE: rm *.* Hier werden alle Files gel”scht. rm *.prg command.txt Hier werden erst alle PRG-Dateien entfernt, im Anschluá daran der File 'command.txt'. rm c:\copy\c_files\ Auf Laufwerk C werden alle Dateien im Unterverzeichnis '\copy\c_files\' gel”scht. rm -i *.c Es werden alle 'C'-Files gel”scht, auf die durch Eingabe eines 'y' als Antwort auf die entsprechende Sicherheitsabfrage des Interpre- ters, reagiert wird. rm -pv *.* Diese Eingabe fhrt zum Entfernen aller Dateien, egal ob das 'read- only'-Attribut gesetzt ist oder nicht (Option 'p'). Es erfolgt bei jedem L”schvorgang eine Anzeige (Option 'v'). rm 'i?test.com' Damit l„át sich eine Datei l”schen, die dummerweise 'i:test.com' heiát. 'i:' ist dabei tats„chlich ein Teil des Namens! Das Fragezei- chen ist notwendig, da TOS sonst glaubt, mit einer Laufwerksbezeich- nung beglckt worden zu sein. ALLGEMEINE BEFEHLE 36 -> rmdir [-iv] ------------------------ (kompletter Name: remove directory) Es kann vorkommen, daá Ordner entfernt werden sollen. Der geeignete Befehl findet sich in "rmdir". Der zu l”schende Ordner muá allerdings leer sein! Option | Bedeutung -------+------------------------------------------------------------ i | Es erfolgt eine Sicherheitsabfrage vor jedem L”schvorgang. | Ein Drcken von bewirkt den Abbruch der Ausfh- | rung. | v | Anzeigen, welche Ordner gerade gel”scht werden. | Ein anderes Kommando zum Entfernen von Ordnern und Dateien kann im Abschnitt ber die externen Kommandos gefunden werden ("erases"). Dieser Befehl erlaubt das Entfernen von vollen Diretories. Jetzt aber nicht einfach ausprobieren, sondern erstmal bei dem Kommando nach- schauen. BEISPIEL: rmdir schrott Diese Eingabe bewirkt ein Entfernen von Directory 'schrott'. -> setlp [intvalue(s)] ---------------------- (kompletter Name: set lineprinter) Die hier angebbare Steuersequenz wird vor dem eigentlichen Ausdruck (mit dem Kommando "lp") an den Drucker geschickt. Soll nichts geschickt werden (default), ist einfach das Argument wegzulassen. Mit "flags" kann die gltige Steuersequenz angeschaut werden. -> settab -------------------- (kompletter Name: set tabulator) Eine weitere Funktion, die den Ausdruck steuert, wird durch dieses mando abgedeckt. Der Benutzer ist hiermit in der Lage, die Tabulator- weite zu bestimmen (defaultm„áig auf 8 Zeichen). Die minimale Weite liegt bei zwei Zeichen! "settab" beeinfluát brigens nicht nur Druckerausgaben. Auch Ausgaben via "cat" oder "more" benutzen die hiermit eingestellte Tabulatorwei- te! Dieser Befehl hat bei Listings natrlich nur eine Bedeutung, wenn das Tabulatorflag, daá angibt ob TAB oder die entsprechende Anzahl Blanks gesendet wird, gesetzt ist. Bezglich einiger externer Kommandos, die auch mit variabler Tabula- torweite arbeiten k”nnen, sei auf die Environment-Variable 'TAB' verwiesen. "flags" zeigt die aktuelle Tabulatorweite an. ALLGEMEINE BEFEHLE 37 BEISPIEL: settab 4 Einstellen der Tabulatorweite auf vier. -> string [-lm] -------------------------------------------- Dieser Befehl dient dem Absuchen von Dateien nach einer bestimmten Zeichenfolge. Es kann dabei sowohl nur eine Datei als auch mehrere angesprochen werden (ber Wildcards). Bei den externen Kommandos findet sich ein Programm namens "grep", daá zur Suche von regul„ren Ausdrcken benutzt werden kann. Im Ver- gleich zu dessen Leistungsf„higkeit (und leider auch Komplexit„t in der Anwendung), ist "string" eigentlich eher ein programmiertech- nischer Unglcksfall. Option | Bedeutung -------+------------------------------------------------------------ l | Nur Ausgabe des Dateinamens, wenn Suchstring gefunden wird. | m | Schaltet den [MORE]-Mechanismus ein. | Soll ein Suchstring Leerzeichen oder Zeichenfolgen enthalten, denen ein '-' vorangeht und damit als Option interpretiert werden k”nnte, muá dieser in Anfhrungszeichen eingeschlossen werden. BEISPIELE: string "Oh sole mio" *.* Es werden alle Dateien des aktuellen Ordners nach dem String 'Oh sole mio' abgesucht. Wird der String in einem File gefunden, wird eine entsprechende Meldung ausgegeben. string Bingo command.txt In diesem Fall wird der File 'command.txt' nach dem String 'Bingo' abgeklappert. string "-m" *.c *.s In allen Dateien mit den Erweiterungen '.c' und '.s' wird nach der Zeichenfolge '-m' gesucht. -> time [-s] [hh:mm] -------------------- Das Setzen bzw. Abfragen der Uhrzeit geschieht mit diesem Kommando. Wird kein Argument angegeben, so erfolgt eine Ausgabe der aktuellen Systemzeit, sonst wird das Argument als neue Systemzeit bernommen. Bei der Ausgabe werden auch die Sekunden angegeben. Beim Setzen darf man diese allerdings nicht angeben! ALLGEMEINE BEFEHLE 38 Option | Bedeutung -------+------------------------------------------------------------ s | Es unterbleibt die Ausgabe von '->time'. | An dieser Stelle sollte vielleicht schon mal der Systemparameter "seconds" Erw„hnung finden. Dessen Bedeutung wird in dem Abschnitt der sich mit den Variablen besch„ftigt erl„utert (vgl. die Ausfhrun- gen zu "let"). BEISPIEL: time 12:4 Setzen der Uhrzeit auf 12 Uhr 4 Minuten. Die Sekunden werden automa- tisch auf Null gesetzt. -> tosext [extension(s)] ------------------------ (kompletter Name: TOS-file extension) Analog zu "prgext", nur wird bei Dateien mit diesen Erweiterungen der Bildschirm nicht eingef„rbt (gilt also fr Files, die normalerweise die Endungen 'TOS' bzw. 'TTP' h„tten). -> version ---------- Dieses Kommando gibt das Erstellungsdatum aus. Es existiert keine eigentliche Versionsnummer! -> which ------------------ Zeigt die ausfhrbare Datei an (plus Pfad), die bei Eingabe von 'command' aufgerufen werden wrde. Bei 'command' findet brigens keine Alias-Ersetzung statt, d.h. es werden nur die Eintr„ge gefunden, die sich durch das Abklappern der Pfadangaben ergeben! i) 'Besondere' allgemeine Befehle --------------------------------- M”chte der Benutzer das Laufwerk wechseln, kann er dazu den "cd"- Befehl benutzen, dies ist aber nicht unbedingt notwendig. Es ist auch m”glich, diesen Wechsel einfach durch Laufwerkskennung und anschlie- áenden Doppelpunkt vorzunehmen. BEISPIEL: a: Wechsel zu Laufwerk A. ALLGEMEINE BEFEHLE 39 Es kommt ab und zu vor, daá Zahlumrechnungen vorgenommen werden mssen. Der Interpreter stellt hier drei Funktionen zur Verfgung: -> # -------------- Eingabe einer Dezimalzahl und deren Umrechnung in das hexadezimale und oktale Žquivalent. ACHTUNG! Dieser Befehl ist rausgeflogen! -> $ -------------- Eingabe einer hexadezimalen Zahl. Als Resultat werden die dezimalen und oktalen Žquivalente ausgegeben. In Batch-Dateien hat das $-Zeichen Argumentbedeutung, d.h. dort werden nicht die Žquivalente angezeigt (vgl. dazu auch den Abschnitt ber das Batchprocessing). ACHTUNG! Dieser Befehl ist rausgeflogen! -> \ -------------- Und als letztes die Umrechnung fr oktale Zahlen. Man kann hier brigens ein Problem erkennen, daá eventuell auftritt, wenn unter Verwendung von '\' ein Programm aufgerufen werden soll. Im Zweifels- fall muá man einfach nur die Laufwerksbezeichnung mit angeben oder mit '/' arbeiten. ACHTUNG! Dieser Befehl ist rausgeflogen! Da Variableninhalte in den drei obengenannten Zahlsystemen ausgegeben werden, k”nnen mit Hilfe der dort zur Verfgung gestellten Funktionen einfache Rechnungen und Ausgaben in den verschiedenen System durchge- fhrt werden. Ich m”chte an dieser Stelle aber nur auf das entspre- chende Kapitel verweisen. EXTERNE KOMMANDOS 40 III. Externe Kommandos und Utilities ==================================== i) Einfhrung ------------- Die Erweiterung des Leistungsumfangs hat im Laufe der Zeit leider auch dazu gefhrt, daá der Interpreter ein unangenehm groáes Stck vom Speicher des STs beansprucht. Dies fhrte bei einigen Benutzern zu Platzmangel (nicht jeder besitzt 4 MB RAM). Dieser Grund hat mich veranlasst, einige der Funktionen, die seltener benutzt werden oder durch ihren Leistungsumfang sehr umfangreich sind, als extra Program- me 'command.prg' beizufgen und die entsprechenden Teile im Interpreter-Code zu l”schen bzw. bei neuen Befehlen erst gar nicht mehr dort einzubauen. Durch diese Trennung ist es fr mich auáerdem einfacher den Funkti- onsumfang von Befehlen zu erweitern und diese Programme zu warten. Dazu kommt auáerdem noch, daá der Verwendung verschiedener Program- miersprachen keine Grenzen gesetzt sind (ich bin inzwischen von MEGAMAX-C auf TURBO-C / PURE-C, LATTICE-C und GFA-BASIC 3.0 umgestie- gen). Vielleicht ein kleiner Hinweis fr Leute, die diese Programme anderweitig benutzen wollen, die Parameterangabe funktioniert ganz normal via Basepage. Durch Verwendung des "path"-Befehls kann der Benutzer einen Suchpfad einrichten, um auf diese externen Funktionen zuzugreifen oder, anders ausgedrckt, um die entsprechenden Programme zu finden. Ein Nachteil dieser Kommandos ist die nun leider notwendige Ladezeit, die vor allem bei Floppy-Verwendern wohl auf weniger Gegenliebe stoáen drfte (hat man gengend RAM zur Verfgung, kann man ja die Verwendung eine RAM-Disk in Erw„gung ziehen). Aber man kann es halt nicht jedem Recht machen. Leider gibt es zu diesen Befehlen keine Hilfe-Funktion wie zu den internen Kommandos. Man muá also mit der vorliegenden Befehlsbeschreibung klarkommen bzw. sich mit dem "man"-Kommando anfreunden. Ein paar der Programm-Dateien liegen in gepackter Form vor (z.B. 'XREF.TTP'). Dadurch verz”gert sich der eigentliche Programmstart etwas. Der Vorteil liegt im geringeren Platz, den ein solcher File ben”tigt. Ich habe in einer Zeitschrift zum ST gelesen, daá 'richtige' Interpreter, Parameter, die Wildcards enthalten ('*' bzw. '?'), selbst„ndig erweitern. Nun, wenn das der Fall ist, hat man es hier mit einem falschen Interpreter zu tun. Parameter werden so an andere Programme weitergegeben, wie sie der Benutzer eingibt. Die eigent- liche Verarbeitung muá dann dort erfolgen. Diese "Faulheit" von 'command.prg' hat einen einfachen Grund, wenn ich ein Programm wie z.B. 'chmod.ttp' aufrufe, dann will ich dessen Funktion nicht nur auf eine Datei angewendet wissen, sondern auf alle Files, die ich mit meiner Parameterangabe erreichen kann, also z.B. auf alle, wenn ich "*.*" benutze. Natrlich ist diese Entscheidung von mir nur ein Kompromiá, so wie die Entscheidung, eine Expansion bereits im CLI EXTERNE KOMMANDOS 41 vorzunehmen, auch nicht der Weisheit letzter Schluá ist. Da es vorkommen kann, daá man mit Programmen arbeitet, die keine selbstst„ndige Bearbeitung dieser Wildcards eingebaut haben (also richtige Programme), findet sich im Abschnitt ber die Eingabeumlei- tung das Beispiel fr eine Batch-Datei, die dieses Problem l”st. Auáer den von mir mitgelieferten Programmen, kann man natrlich auch seinen eigenen Kram bzw. anderes Zeug wie z.B. eins der tausend Formatier-Programme, die so im Umlauf sind, zu diesen externen Funktionen hinzunehmen. Bei den Programmen muá man beachten, daá die Groázgigkeit im Umgang mit der Position von Optionen hier nicht immer gegeben ist. Eine Reihe dieser Machwerke erlaubt diese Angaben nur als erstes Argument! Bei Programmen, die Teile einer Textdatei auf den Bildschirm ausgeben (z.B. "tail" oder "emore"), kann mithilfe der Environment- Variablen 'TAB' die Tabulatorweite eingestellt werden. Diese kann beispielsweise mit dem Kommando appendenv TAB=8 geschehen. Die Weite wrde jetzt bei 8 Zeichen liegen. Es ist durchaus sinnvoll, sich ein solches Kommando in der Startup-Datei 'auto.com' abzulegen. ii) Funktionen -------------- -> acc ------ Es kann vorkommen, daá ein Benutzer vom Interpreter aus ein Accessory aufrufen m”chte. Nach dem Aufruf kann man, wie sonst auch, mithilfe der Maus ein Accessory starten. Klickt man den Eintrag 'Exit' an, wird "acc" wieder verlassen. Das Programm ist in GFA-BASIC entstanden, da diese Programmiersprache den einfachen Aufbau des notwendigen Menues sehr leicht macht. -> ascii ------------------ Dieser Befehl extrahiert aus Bin„rdateien alle ASCII-Zeilen (Umlaute sind nicht ASCII!). Damit kann man z.B. in Programmen Meldungen oder bestimmte Textausgaben finden. Soll die Ausgabe von "ascii" in eine Datei erfolgen und nicht, wie voreingestellt, auf den Bildschirm, muá von der Ausgabeumleitung Gebrauch gemacht werden. -> bigfile <-[a|b][f][r|w][q]> ----------------------------------------------- Wer das Programm TERRAPIN kennt, wird mit diesem Kommando keine Probleme haben. Es dient der Abspeicherung bzw. Restaurierung von Dateien, die durch ihre Gr”áe nicht auf eine einzelne Diskette passen EXTERNE KOMMANDOS 42 wrden. Solche Files werden dann auf mehrere Floppies aufgeteilt. Der Vorteil zu TERRAPIN liegt zum einen in der h”heren Verarbeitungs- geschwindigkeit und zum anderen wird eine Diskette besser ausgentzt. Dafr kann man mit "bigfile" beschriebene Disketten nicht einfach wieder unter TOS verwenden. Dazu muá entweder eine Neuformatierung durchgefhrt werden oder man benutzt "quickdel". Das Programm arbei- tet nur, wenn genug freier Speicher zur Verfgung steht, um die Kapazit„t einer kompletten Diskette im RAM zu halten. Leute, die mit 1MB arbeiten, werden hier unter Umst„nden Probleme bekommen. Beim Aufruf des Programms muá ber die Option angegeben werden, ob eine Datei auf Diskette kopiert werden soll oder eine Datei-Restau- rierung von Diskette gewnscht wird. Dies geschieht durch die Angaben von 'w' fr Schreiben und 'r' fr Lesen. Fehlen beide Angaben, wird von eine Schreib-Vorgang ausgegangen. Das Laufwerk ist immer anzuge- ben. Wird Disk 'A' und 'B' angegeben wird immer abwechselnd ausgege- ben bzw. eingelesen (mit Laufwerk A beginnend). In diesem Fall wird bei einem Wechsel auf die n„chste Diskette keine Benutzeranfrage zum Weitermachen durchgefhrt. Ausnahme, wenn die falsche Diskette ein- liegt oder wenn erst eine Formatierung durchgefhrt werden soll. Dadurch kommt man im Zwei-Floppy-Betrieb auf einen recht guten Durch- satz. Beim Abspeichern einer Datei auf Diskette muá der Name des Files angegeben werden, beim Restaurieren ein Zielordner (keine Datei!) bzw. Ziellaufwerk. Disk-Laufwerke k”nnen beim Restaurieren nicht als Ziel benutzt werden, das Programm wrde sich in einem solchen Fall mit einem Fehler melden! Stellt "bigfile" beim Schreiben auf eine Diskette fest, daá ein Fehler aufgetreten ist, erfolgt eine Meldung und man kann diesen einen Schreibvorgang mit einer anderen Diskette erneut durchfhren, d.h., es ist nicht notwendig, jedesmal wieder bei Null anzufangen. Alle Benutzereingaben, die mit beantwortet werden, fhren zu einem Abbruch des Kommandos. "bigfile" drfte in der Hauptsache fr Leute interessant sein, die statt der ewigen Diskettenschaufelei bei Backups von Harddisk-Parti- tions lieber ein Packer-Programm benutzen, daá es erlaubt, nur neue Dateien in ein Archiv aufzunehmen (die meisten k”nnen das). Die daraus entstehenden Dateien haben fr gew”hnlich šberl„nge und kann man ja dann von Zeit zu Zeit mit "bigfile" auf Diskette ablegen. Damit vermindert man die Gefahr eines Verlustes seiner unwichtigen und nebens„chlichen Daten, ohne die man allerdings nicht mehr leben kann. Option | Bedeutung -------+------------------------------------------------------------ a | Aus-/Eingabe von Laufwerk A. | b | Aus-/Eingabe von Laufwerk B. | f | Vor Abspeichern wird Diskette erst formatiert. Beschleu- | nigt den ganzen Kopiervorgang natrlich nicht gerade! | Diese Option hat bei einer Restaurierung ('r') natrlich | keine Wirkung. | q | Abspeichern auf Diskette ohne Verify. Dies sollte man nur | bei Verwendung von gutem Diskettenmaterial angeben! | EXTERNE KOMMANDOS 43 r | Einlesen und Restaurieren einer Datei von Diskette. | w | Abspeichern einer Datei auf Diskette (Voreinstellung). | BEISPIEL: bigfile -wabq part_h.lzh Datei 'part_h.lzh' wird auf Disketten kopiert. Dabei ist der Disk- Verify abgeschaltet und es wird abwechselnd auf Laufwerk A und B geschrieben. -> cal [month] --------------------- (kompletter Name: calendar) Diese Funktion gibt den entsprechenden Monat eines bestimmten Jahres aus (Wochentage und zugeh”rige Daten). L„át man die Monatsangabe weg, erfolgt die Ausgabe eines kompletten Jahres. BEISPIEL: cal 3 1989 Ausgabe des M„rz 1989. Man sollte vielleicht beachten, daá die Jahreszahl mindestens einstellig sein muá (es wird dann 1900 dazuge- z„hlt). -> chmod ------------------------- (kompletter Name: change mode) Dieser Befehl kann zur Žnderung von Fileattributen benutzt werden. Bei den Fileangaben sind Wildcards zugelassen. 'mode' repr„sentiert eine Integerzahl, die das neue Attribut darstellt (wobei 'mode' noch zus„tzliche Informationen enthalten kann, auf die ich weiter unten eingehen m”chte). Man sollte bei Verwendung dieses Befehls etwas Vorsicht walten lassen. Ich habe z.B. mal aus einem normalen 'auto.com'-File ein Volumelabel gemacht. Leider hat die Rckfhrung in eine normale Datei nicht mehr funktioniert. Das Betriebssystem ist hier leider ziemlich restriktiv ausgelegt! Hier ist man zur Žnderung mit einem Disk-Moni- tor gezwungen. Es ist mir bis jetzt auch noch nicht gelungen, Verzeichnissen z.B. das 'read only'-Attribut zu vergeben (was ja als Schutzfunktion recht ntzlich w„re). Irgendwie hat man auf solche Eintr„ge keinen Zugriff via GEMDOS-Funktion 'Fattrib()'. EXTERNE KOMMANDOS 44 An dieser Stelle ist eine Zusammenstellung der Bits und ihrer Bedeu- tung wohl ganz hilfreich: Bit 0: Datei ist schreibgeschtzt (kann z.B. nicht durch "rm" gel”scht werden Bit 1: Datei ist versteckt (wenigstens ein biáchen), d.h. man findet sie nicht mehr auf dem Desktop angezeigt Bit 2: es handelt sich um eine Systemdatei (habe bis jetzt noch keine gefunden) Bit 3: Volumelabel (kann man z.B. beim Formatieren angeben) Bit 4: Verzeichnis Bit 5: ist das Archivbit (Kennung 'wc'), wird wohl dann interessant, wenn es Backup-Programme gibt, die an diesem Bit erkennen, ob eine Datei schon mal gesichert worden ist oder nicht Um die entsprechende Eigenschaft zu besitzen, muá das jeweilige Bit gesetzt sein! Noch ein Wort zu den Dateien mit dem 'hidden'-Attribut. In „lteren TOS-Versionen sind diese Dateien trotzdem auf dem Desktop aufge- taucht, wenn zus„tzlich zu diesem Attribut noch ein anderes (z.B. 'read-only') gesetzt war. Dies hat sich unter TOS 1.4 ge„ndert, d.h. die Dateien werden nun wirklich nicht mehr angezeigt. In „lteren Interpreterversionen, d.h. als "chmod" noch nicht zu den externen Kommandos geh”rt hat, war 'mode' einfach nur eine Integer- zahl, die das neue Attribut repr„sentierte. Diese Eigenschaft ist beibehalten worden, d.h. wird als Argument einfach nur eine Zahl angegeben, so wird diese als neues Dateiattribut bernommen. Es gibt jetzt allerdings noch einige weitere Spielereien, die man machen kann, z.B. 'mode' hexadezimal, dezimal, oktal oder bin„r angeben: $a dies ist eine hexadezimale Eingabe o104 dies ist eine oktale Eingabe %101 dies ist eine bin„re Eingabe 7 dies ist eine dezimale Eingabe Man erkennt, daá es nur vom ersten Zeichen abh„ngt, welches Zahlsys- tem erwartet wird. Auáerdem kann man das momentan existierende Dateiattribut in das neue Attribut miteinbeziehen. Dafr gibt es die drei logische Operationen AND, OR und XOR (entweder oder): & := 'altes Attribut' AND 'neues Attribut' | := 'altes Attribut' OR 'neues Attribut' ^ := 'altes Attribut' XOR 'neues Attribut' Es ist also m”glich gezielt Bits zu setzten bzw. zu l”schen. Diese M”glichkeit macht die beiden Befehle "save" und "unsave" eigentlich unn”tig aber da sie sowieso bereits extern sind, habe ich sie nicht vollends rausgeschmissen. Man muá vielleicht noch beachten, daá sich der Aufruf des Kommandos von der alten eingebauten Version unterscheidet. Erst kommen die Dateien, dann das neue Attribut. Die alte Version lieá es nun zu, wieder Dateien mit einem Attribut usw. anzugeben, das geht jetzt nicht mehr! Ich glaube allerdings, daá man, in Anbetracht der Erwei- terungen, die dieser Befehl erfahren hat, mit dieser Einschr„nkung EXTERNE KOMMANDOS 45 leben kann. BEISPIELE: chmod *.prg 1 Allen PRG-Dateien im aktuellen Ordner wird das 'nur lesen'-Attribut verliehen. chmod *.prg |1 Bei allen PRG-Files wird noch zus„tzlich zu den bestehenden Attri- buten das 'nur lesen'-Attribut gesetzt (entspricht "save *.prg"). Man kann erkennen, daá OR zum Einblenden von Bits benutzt wird. chmod *.prg &$fe Hier sieht man den Ersatz fr den "unsave"-Befehl. AND ('&') sorgt dafr, daá das letzte Bit ausgeblendet wird. '$fe' repr„sentiert ein Beispiel fr eine hexadezimale 'mode'-Angabe. Fr die Verwendung von XOR ist mir bis jetzt leider noch nichts berm„áig geistreiches eingefallen. Ich habe diese Funktion halt eingebaut, weil es ohne gr”áeren Aufwand zu bewerkstelligen war. Was man damit nun anstellt sei dem Anwender anheim gestellt (zum Quatsch machen ist sie brigens wunderbar geeignet!). -> clist [-n] ----------------------- "clist" kann von C-Dateien List-Files erzeugen, die die Blockschach- telungstiefe und Zeilennummer anzeigen. Reine Kommentarzeilen werden vor der Zeilennummer mit einem 'C' gekennzeichnet. Nach der Zeilen- nummer kommt die Blockschachtelungstiefe. Diese wird durch die Anzahl der offenen Klammernpaare ('{' / '}') bestimmt. Auf diese folgt dann die eigentliche Code-Zeile. Wenn man sich die Ausgabe von "clist" einmal anschaut, drfte es eigentlich keine Probleme mit dem Ver- st„ndnis geben. Dieses Programm kann manchmal recht ntzlich zur Fehlersuche ange- wandt werden. Die normale Ausgabe erfolgt auf den Bildschirm, kann aber durch die Ausgabeumleitung umgelenkt werden. Option | Bedeutung -------+------------------------------------------------------------ n | Keine geschachtelten Kommentare | -> compress [-c[1|2|3]|d] [file(s)] --------------------------------------------- Dieses Programm dient dem Ein-/Auspacken von Dateien. Diese werden beim Packen im File 'archive' abgelegt, bzw. beim Entpacken aus diesem extrahiert. Soll entpackt werden darf das Argument 'file(s)' nicht angegeben werden! Es werden immer alle in 'archive' vorhandenen Dateien extrahiert. EXTERNE KOMMANDOS 46 Wird 'archive' ohne Extension, und dazu z„hlt auch der Punkt, angegeben, erweitert "compress" diese Angabe um '.LZW' (in Anlehnung an den verwendeten Algorithmus). Dies gilt sowohl fr das Ein- als auch fr das Auspacken! Option | Bedeutung -------+------------------------------------------------------------ c | Packen von Dateien. Nach 'c' kann noch eine der Ziffern | '1', '2' oder '3' folgen (direkt auf das 'c'). Damit wird | angegeben, wie grndlich gepackt werden soll. '1' ist da- | bei am effektivsten, braucht allerdings auch am meisten | freien RAM-Speicher, '3' liefert die gr”áten Ergebnisse, | ben”tigt aber den wenigsten Speicher, '2' liegt in der | in der Mitte dieser beiden Punkte. | d | Option, die angibt, daá eine Datei entpackt werden soll. | 'd' ist die Voreinstellung und muá nicht unbedingt angegeben | werden. | Qualitativ liegt das Ergebnis dieses Programmes zwischen ZOO (vor Version 2.1), ARC, die es fr gew”hnlich immer schl„gt, und LHARC. Diese Packer k”nnen allerdings alle zur Archivierung ganzer Ordner- systeme benutzt werden, so daá die Verwendung von "compress" wohl wirklich nur fr die Leute geeignet ist, die keine andere Alternative haben oder wenig Zeit fr eine Komprimierung aufwenden wollen. "compress" schl„gt alle drei vorgenannten Komprimierer von der Geschwindigkeit her gesehen zum Teil um L„ngen! Die Komprimierung basiert auf dem guten alten Lempel-Ziv/Welch-Verfahren. Noch ein Wort zur Warnung, beim Versuch bereits gepackte Dateien noch weiter zu Komprimieren, werden die Ergebnisdateien sehr groá! Es findet keine šberprfung statt, ob ein Packen berhaupt irgendwelche Einsparungen bringt oder vielleicht sogar gr”áere Files liefert! ACHTUNG! Dieser Befehl hat mit dem UNIX-"compress" eigentlich nur den Namen gemein! BEISPIELE: compress -c command.lzw command.txt Packen der Datei 'command.txt'. Archivdatei ist 'command.lzw'. compress command.lzw Auspacken des Archivs 'command.lzw'. compress -c3 ttp.lzw *.ttp Packen und Ablegen aller 'TTP'-Dateien in 'ttp.lzw'. Dabei soll nicht so grndlich gepackt werden, da z.B. der freie Speicherplatz knapp ist. -> crypt -------------------------------------- M”chte man einen File ver- bzw. entschlsseln, so kann dazu dieser Befehl benutzt werden. Um den Kodierungsvorgang zu starten, ist es EXTERNE KOMMANDOS 47 notwendig, zwei Zahlen ('keyA' und 'keyB') einzugeben. Nur mit diesen kann ein verschlsselter File wieder dekodiert werden! 'fileA' stellt den zu ver- /entschlsselnden File dar, 'fileB' repr„sentiert die Ausgabedatei. ACHTUNG, im Laufe der Zeit (oder besser: der Interpreterversionen) sind an diesem Programmteil immer wieder Žnderungen vorgenommen worden! Es ist daher fr Benutzer dieses Befehls notwendig, festzu- stellen ob ein Entschlsseln von Dateien, die mit einer „lteren Version verschlsselt worden sind, noch m”glich ist. Kann dies nicht mehr durchgefhrt werden, muá man den fraglichen File erst mit der „lteren Version wieder in seinen Urzustand bringen! Wie sicher die Kodierung ist, mag jeder selbst entscheiden. Die beiden Schlssel sind vom Typ 'long', damit ergeben sich schon einige Kodierungsm”glichkeiten. Es k”nnen brigens auch negative Schlssel benutzt werden. BEISPIELE: crypt 123 4711 command.txt command.crp Die Datei 'command.txt' wird in verschlsselter Form im File 'command.crp' abgelegt. Soll aus 'command.crp' wieder der entschls- selte File entstehen, muá einfach crypt 123 4711 command.crp command.ent eingegeben werden. 'command.ent' repr„sentiert nun den entschlssel- ten File. Es h„tte natrlich auch irgendein anderer Dateiname gew„hlt werden k”nnen. Der Urfile (in diesem Fall 'command.txt') wird brigens weder gel”scht noch sonst irgendwie ver„ndert! Wer ganz besonders sicher gehen will, kann ja noch ein Programm zur Filekomprimierung, wie z.B. ARC oder ZOO, der Quelldatei vor der eigentlichen Verschlsselung benutzen; ich habe irgendwo gelesen, daá das die ganze Sache dann ziemlich narrensicher macht. -> dcopy [-adimnqs] <[target_device:][target_directory]> -------------------------------------------------------------------- (kompletter Name: directory copy) M”chte man einen Ordner mit Inhalt auf ein anderes Laufwerk kopieren, kann man dazu dieses Kommando benutzen. Es ist sogar m”glich, den kompletten Inhalt eines Laufwerks auf ein anderes zu kopieren. Wird kein Ziellaufwerk angegeben, muá zumindest ein Zielordner ange- geben werden, d.h., es ist immer ein zweites Argument anzugeben! Option | Bedeutung -------+------------------------------------------------------------ a | šbernahme des Dateiattributs von der Quelldatei. | d | Es wird nur die Ordnerstruktur auf dem Ziellaufwerk/Ordner | erzeugt, also keine Dateien kopiert. | i | Es wird nachgefragt, ob bereits existierende Dateien ber- | schrieben werden sollen. | m | L”scht die kopierten Dateien und Ordner auf dem Quell- EXTERNE KOMMANDOS 48 | laufwerk. Dateien mit 'read-only'-Attribut und Ordner, die | nicht leer sind, bleiben erhalten (keine Fehlermeldung). | n | Nur Dateien, die noch nicht existieren werden kopiert. | q | Beim Kopieren auf Diskette wird kein Verify durchgefhrt. | Dadurch wird die Sache schneller, sollte aber nur bei gutem | Diskettenmaterial gemacht werden! | s | Es unterbleibt die Anzeige, welche Datei gerade kopiert bzw. | welcher Ordner gerade erzeugt wird. | Die Optionen drfen nur an erster Stelle in der Argumentliste stehen! Ein Abbruch der Kopiererei kann mit erreicht werde. Es kann allerdings vorkommen, daá man sich dann nicht im gleichen Ordner wiederfindet wie bei Programmaufruf. Mit diesem Befehl sollte man auch mal die M”glichkeiten von "cp" vergleichen. Was die Geschwindigkeit angeht, so entspricht sie in etwa der der Desktop-Kopiererei. Bei umfangreicheren Kopiervorg„ngen ist "dcopy" etwas schneller (kaum der Rede wert). Das h„ngt aber in groáem Umfang von dem zur Verfgung stehenden Speicher ab. Das Kopieren selbst ist dateiorientiert, d.h. beim Hin- und Herschau- feln zweier Disketten ist man mit Kopierprogrammen, die sektorweise arbeiten, wesentlich besser bedient. Das Startargument, damit ist 'directory' gemeint, kann eine komplette Pfadangabe enthalten. Dies umfaát auch die Bezeichnung fr ein Laufwerk. Es macht aber einen kleinen Unterschied, ob diese Pfadanga- be mit einem '\' abgeschlossen ist oder nicht. Im ersten Fall, also mit '\', wird dieser Ordner nicht erzeugt! Unterverzeichnisse dieses Ordners werden allerdings angelegt. Im zweiten Fall erfolgt auch ein Erzeugen des Ordners selbst. Jetzt noch eine kleine Anmerkung um die Flucherei ber das manchmal etwas seltsame Verhalten dieses Kommandos m”glichst niedrig zu halten. Es ist normalerweise nicht (!) erlaubt im Zielordner-Argument Wildcards (also '?' bzw. '*') zu verwenden. Dann kracht man auf eine Fehlermeldung. Es kommt aber wohl ”fters vor, daá man z.B. von einer bestimmten Partition einen bestimmten Ordner an genau die Stelle kopieren will, an der man sich gerade befindet. Man kann jetzt ein- fach als Ziel das aktuelle Laufwerk angeben, oder aber man tippt frohen Mutes '*.*' ein, daá ist n„mlich die Ausnahme von der 'keine- Wildcards'-Regel. Auch die Benutzung eines Arguments, daá z.B. wie 'b:*.*' aussieht, ist in diesem Fall zul„ssig, daraus wird dann einfach 'b:' gemacht. BEISPIELE: dcopy a: b: Kopieren aller Dateien und Ordner vom aktuell gltigen Verzeichnis auf Laufwerk A in den gerade aktiven Ordner von Laufwerk B. Befindet man sich auf beiden Laufwerken gerade im Wurzelverzeichnis, wird die komplette Diskette kopiert. EXTERNE KOMMANDOS 49 dcopy megamax e:\juhu Kopiert Ordner 'megamax' mitsamt Inhalt vom aktuellen Laufwerk auf Device E in das Verzeichnis 'juhu' (dieses muá brigens bereits existieren!). dcopy d: part_d Kopiert alle Dateien und Ordner aus dem aktiven Verzeichnis von Laufwerk D in den Ordner 'part_d' des aktuellen Laufwerks. dcopy -s d: part_d Dergleiche Kram wie im vorhergehenden Beispiel, nur diesmal ohne Geslze. dcopy f:\metafont g: Auf Laufwerk G wird Ordner 'metafont' erzeugt und alle Verzeichniss und Dateien, die dieser besitzt eingerichtet. dcopy f:\metafont\ g: Der Ordner 'metafont' wird nicht erzeugt aber alle Dateien und Ordner, die unter ihm zu finden sind. -> dcrypt --------- (kompletter Name: drive crypt) Wie bereits angesprochen, kann man mit "crypt" einzelne Dateien verschlsseln. "dcrypt" kann zum Verschlsseln von kompletten Parti- tions bzw. Laufwerken benutzt werden. Das Programm fordert dazu vom Benutzer zwei Zahlen ('key A' und 'key B', maximal 7 Stellen), sowie die zu bearbeitende Partition (bzw. Laufwerk) an. Die beiden Schls- sel erscheinen dabei nicht als Klartext auf dem Bildschirm (pro Ziffer erscheint ein '*'). Wird bei einer dieser Eingaben gedrckt, erfolgt ein Abbruch des Programms. W„hrend der eigentlichen Codierung hat keine Wirkung! Ein Abbruch wrde zur Folge haben, daá ein Teil des Laufwerks verschlsselt und eine Teil unverschlsselt ist. Es ist ziemlich aussichtslos, solche Daten wieder korrekt restaurieren zu wollen. Das Laufwerk wird komplett verschlsselt (auch unbenutzte Sektoren sind in diesen Vorgang mit einbezogen). Zum Entschlsseln muá man die gleichen Zahlen wie beim Verschlsseln angeben. Bis auf den ersten Sektor (Boot-Sector) werden alle bearbeitet. Es ist zu beachten, daá man mit verschlsselten Boot-Partitions den Rechner nicht mehr starten kann! Probleme hatte ich bis jetzt nur bei RAM-Disks. Aber dort ist ein Verschlsseln wohl weniger sinnvoll. Geschwindikeitsm„áig ist das Programm nicht so besonders berauschend. EXTERNE KOMMANDOS 50 -> delequ [-cenpst] --------------------------------------------- (kompletter Name: delete equivalent) Es kann h„ufiger passieren, daá sich im Laufe der Zeit in unterschiedlichen Ordnern die gleichen Dateien ansammeln. Um diese 'Doppelbelegung' zu entfernen kann "delequ" verwendet werden. Es entfernt alle Dateien, die in 'directoryA' und 'directoryB' vorkommen aus 'directoryB'. Option | Bedeutung -------+------------------------------------------------------------ c | Dateien werden Byte-fr-Byte verglichen. Normalerweise wird | nur Gr”áe und Name auf Gleichheit untersucht. | e | Kann eine Datei nicht gel”scht werden, erfolgt kein Abbruch | des Kommandos. | n | Es wird bereits bei Namensgleichheit gel”scht. Diese Option | vertr„gt sich nicht mit 't' bzw. 'c'. | p | Es werden auch schreibgeschtzte Dateien entfernt. | s | Es wird nicht angezeigt, welche Datei gerade entfernt worden | ist. | t | Fr den Vergleich ist auch Erstelldatum und -zeit relevant. | -> diskcopy ---------------------------------------------- Mit diesem Kommando kann man zwei Disketten kopieren. Man spart sich also den Umweg ber das Desktop (wenn man eh' nicht ein anderes Kopierprogramm benutzt). Das Kopieren wird nur durchgefhrt, wenn das Format der Zieldisket- te, dem der Quelldiskette entspricht. -> drucker ... ------------------------------------ Dieses Programm entstand auf Anregung eines Benutzers, der neben der M”glichkeit via "setlp" und "lp" Steuerzeichen an den Drucker zu schicken, auch mal nur Steuerzeichen ohne einen eigentlichen Ausdruck loswerden wollte. Die Argumente stellen Dezimalzahlen dar, die direkt an den Drucker abgesetzt werden. Unsinnige Eingaben wie Buchstaben, lustige negative oder zu groáe Zahlenbereiche werden nicht abgeprft. Im groáen und ganzen findet eigentlich berhaupt keine Fehlersuche statt, d.h. man muá selbst dafr sorgen, daá man aus dem Zeichenbereich, der von 0 bis 255 geht, nicht rauskommt. -> emore [-dflps] [-] [+/] [+] ------------------------------------------------------------ (kompletter Name: extended more) Dieser Befehl stellt eine Erweiterung zu "more" dar. Sein Leistungs- EXTERNE KOMMANDOS 51 umfang bertrifft dabei dieses interne Kommando betr„chtlich. Da die meisten Benutzer aber mit den einfachen M”glichkeiten, die "more" bietet, auskommen, ist "emore" bei den externen Kommandos gelandet. Das Vorbild findet sich brigens in UNIX. Grunds„tzlich dient dieser Befehl zur seitenweisen Ausgabe von ASCII- Dateien auf den Bildschirm. Es ist dabei z.B. m”glich ganze Dateibe- reiche zu berspringen oder ab anzugebenden Suchbegriffen eine Ausgabe durchzufhren. Option | Bedeutung -------+------------------------------------------------------------ d | Bei jedem Bildschirmhalt wird die Meldung '[MORE]' aus- | gegeben. | f | Zeilen die ber den rechten Rand hinausgehen, werden nicht | mehr in der Folgezeile weitergeschrieben. | l | Ein Formfeed zeichen l”st nicht mehr das L”schen des Bild- | schirms aus. | p | Statt scrollen wird jedesmal der Bildschirm gel”scht. | s | Leerzeilen werden nicht ausgegeben. | '-' gibt die Bildschirmgr”áe an. '+/' beginnt die Ausgabe erst bei 'string' und '+' berspringt die angegebene Anzahl von Zeilen. BEISPIELE: emore -10 *.c Bildschirmgr”áe wird auf zehn Zeilen festgelegt. Es werden alle Dateien mit der Erweiterung 'C' betrachtet. emore +/Text *.dat Die Ausgabe beginnt ab der Zeile in der 'Text' vorkommt. emore +10 abc.def šberspringt bei der Ausgabe die ersten zehn Zeilen der Datei 'ABC.DE- F'. Die folgende Liste umfaát die Kommandos, die bei einem Warten auf eine Benutzereingabe benutzt werden k”nnen ('#' steht dabei fr eine Zahlen-Angabe): Tasten | Wirkung -----------+-------------------------------------------------------- | Ausgabe der n„chsten Seite | Ausgabe der n„chsten Zeile <^B> | halben Bildschirm zurck <^D> | halben Bildschirm vorw„rts # | gehe '#' Zeilen vorw„rts = | zeige Nummer der aktuellen Zeile EXTERNE KOMMANDOS 52 . | wiederhole vorhergehendes Kommando ' | gehe an den Punkt zurck, an dem letzte Suche begann #/ | gehe zum '#' Auftreten von 'string' :f | zeige aktuellen Dateinamen und Zeile #:n | berspringe '#' Dateien (die aktuelle z„hlt mit) #:p | gehe '#' Dateien zurck b | halben Bildschirm zurck d | halben Bildschirm vorw„rts #f | berspringe '#' Bildschirme #n | gehe zum '#' Auftreten des zuletzt eingegebenen Such- | strings q | verlasse das Kommando (geht auch mit ) Q | verlasse das Kommando #s | berspringe '#' Zeilen #z | gehe '#' Zeilen vorw„rts und bernehme '#' als neue | Bildschirmgr”áe So, und jetzt sollte man das Kommando einfach ausprobieren. Man erkennt dann recht schnell die Bedeutung der verschiedenen Befehle. Die Tabulatorweite ist auf vier Zeichen eingestellt! Dies kann allerdings durch die Environment-Variable 'TAB` ge„ndert werden. -> enttab [tab_width] ------------------------------- (kompletter Name: entferne TABs) "enttab" ersetzt in Textdateien alle vorkommenden Tabulatorzeichen durch die entsprechende Anzahl Leerzeichen (vgl. auch das externe Kommando "tab"). 'tab_width' kann zum Setzen einer bestimmten Tabulatorweite angegeben werden (2 - 9). Wird sie weggelassen, erfolgt die Bearbeitung mit einer Voreinstellung von 8 Zeichen. Die aus der Umwandlung resultierenden Files haben die Endung 'TAB'. -> equal ------------------------ Ausgabe aller Zeilen von 'fileA', die auch in Datei 'fileB' vorkom- men. Die Ausgabe erfolgt auf den Bildschirm, kann aber beispiels- weise in einen anderen File umgeleitet werden. Es versteht sich hoffentlich von selbst, daá es sich hierbei um ASCII-Dateien handeln muá! -> erasef [-aeipsw] ----------------------------- (kompletter Name: erase files) Mit dem Programm, daá hinter dieser Funktion steht, lassen sich auf einem Laufwerk/Partition bestimmte bzw. alle Dateien l”schen, d.h es werden auch alle Unterverzeichnisse abgeklappert! Man k”nnte wohl sagen, daá der "rm"-Befehl eine Untermenge dieses Kommandos dar- stellt. Es werden bei nichtgesetzter Option 'p' nur Dateien entfernt, die nicht mit dem 'read-only'-Attribut versehen sind! EXTERNE KOMMANDOS 53 Option | Bedeutung -------+------------------------------------------------------------ a | Es wird nicht vom Wurzelverzeichnis aus vorgegangen, son- | dern vom aktuellen Ordner. | e | Abbruch der Befehlsausfhrung, wenn eine Datei nicht ent- | fernt werden kann. | i | Sicherheitsabfrage vor dem L”schvorgang. | p | Auch Dateien mit gesetztem 'read-only'Attribut werden ge- | l”scht. | s | Unterdrckt die Bildschirmausgabe. | w | Vor dem eigentlichen L”schvorgang wird die Datei mit Nullen | berschrieben. | Man sollte bei der Benutzung dieses Kommandos ein biáchen aufpassen, sonst werden Files gel”scht, die man vielleicht noch einmal gebraucht h„tte. Der L”schvorgang l„át sich durch Drcken von abbrechen (die bis dahin gel”schten Dateien sind allerdings verloren). Zu jedem L”schvorgang wird eine Meldung auf dem Bildschirm ausgege- ben. BEISPIELE: erasef a:*.bak b:*.dup Erst werden auf Laufwerk A alle Dateien mit der Extension 'BAK' gel”scht, dann auf Laufwerk B alle 'DUP'-Files. erasef -p *.prg L”schen aller 'PRG'-Dateien, ohne Rcksicht auf das 'read-only'- Attribut. -> erases [-psw] ----------------------------------- (kompletter Name: erase subdirectories) Diese Funktion l”scht den angegebenen Ordner/File. Sollte ein nichtleeres Verzeichnis angegeben worden sein, wird erst dessen Inhalt entfernt, dann der eigentliche Verzeichnisname! Es werden bei nichtgesetzter Option 'p' keine Dateien gel”scht, die das 'nur lesen'-Attribut haben. Hat eine L”schung fehlgeschlagen, erfolgt ein Programmabbruch. Option | Bedeutung -------+------------------------------------------------------------ p | Auch Dateien mit gesetztem 'read-only'-Attribut werden | gel”scht. | s | Unterdrckung der Bildschirmausgabe. | EXTERNE KOMMANDOS 54 w | šberschreibt vor dem eigentlichen L”schvorgang die Datei | mit Nullen. Das ganze bremst das Entfernen der Files natr- | lich ziemlich ab! | Beim Argument k”nnen Wildcards benutzt werden, man sollte dann aller- dings aufpassen, daá man auch wirklich nur die gewnschten Eintr„ge l”scht. Es ist m”glich vor den File/Ordnernamen ein Laufwerk mit anzugeben (z.B. 'b:scratch'). Es wird dann dort der L”schvorgang durchgefhrt. Nach der L”schung befindet man sich allerdings wieder auf dem urspr- nglichen Laufwerk. Jeder gel”schte Eintrag wird angezeigt. Ein Abbruch des Kommandos ist durch Drcken von m”glich. Was bis zu diesem Zeitpunkt allerdings bereits gel”scht ist, wird nicht wiedergeholt! Es ist immer nur ein Ordner-/Filename als Argument zul„ssig. Damit habe ich versucht eine gewisse Schadensbegrenzung bei einer ver- sehentlichen Falscheingabe durchzufhren. BEISPIELE: erases ordnerA Es werden alle Eintr„ge des Ordners 'ordnerA' und der Ordner selber gel”scht. erases -p dir_1 Es werden alle Elemente (Dateien, Unterverzeichnisse, Dateien in diesen Unterverzeichnissen...), auch diejenigen mit gesetztem 'read- only'-Attribut, aus dem Ordner 'dir_1' entfernt. Abschlieáend wird der Ordner selbst entfernt. erases -ps *.* L”scht vom aktuellen Verzeichnis aus alle Unterordner und Dateien. Es erfolgt dabei keine Bildschirmausgabe und auf das 'read-only'- Attribut wird keine Rcksicht genommen. Befindet man sich hier im Wurzelverzeichnis, werden alle Eintr„ge, die sich auf dem Laufwerk befinden, entfernt (vgl. auch "quickdel" und "wipeout"). -> fcrypt [ ] ----------------------------------- (kompletter Name: file crypt) Dieses Kommando soll einmal "crypt" ersetzen. Im Gegensatz zu diesem Befehl, wirkt sich "fcrypt" direkt auf die anzugebenden Dateien aus, d.h., daá es keine extra Ausgabedateien mehr gibt! Auáerdem l„át sich der Befehl auf mehrere Dateien gleichzeitig anwenden. 'KeyA' und 'KeyB' sind zwei Integerzahlen, die maximal 8 Zeichen lang sein drfen (alles was darber ist, wird abgeschnitten). Die Angabe eines Vorzeichens ist nicht erlaubt! Bei Aufruf des Befehls ohne Argument, werden die entsprechenden Angaben vom Benutzer angefordert. Dabei werden die beiden Schlssel nicht auf dem Bildschirm angezeigt (sondern nur Sternchen). Bei der Angabe der Dateien ist pro Abfrage immer nur ein File zul„ssig. Die letzte Angabe muá durch einfaches Drcken von kenntlich EXTERNE KOMMANDOS 55 gemacht werden. Es ist jederzeit m”glich, diese Prozedur durch abzubrechen. Ist bei einer Dateiangabe das letzte Zeichen ein ':' oder ein '\', wird automatisch '*.*' angeh„ngt. -> fct [day month year hour min sec] ------------------------------------------- (kompletter Name: file creation time) Mit Hilfe von "fct" l„át sich das Erstellungsdatum einer Datei im nachhinein „ndern. Das ist in der Hauptsache fr Leute interessant, die unter Verwendung von MAKE-Utilities ganze Dateisysteme zusam- mencompilieren bzw. -linken. 'file' kann Wildcards enthalten, darf aber nur als erstes Argument vorkommen, d.h., daá mehrere Dateiangaben nicht zul„ssig sind! Wird kein zu setzendes Datum als Argument angegeben, nimmt "fct" die aktuelle Zeit/Datum. In der Datumsangabe mssen nicht alle Elemente vorhanden sein. "fct" ersetzt fehlende Angaben durch die alten Zeitangaben. Es wird allerdings immer von vorne mit der šbernahme der Angaben begonnen, d.h. man kann nicht einfach den Tag weglassen und dann hoffen, daá das Programm dies dann mitbekommt. In diesem Fall wrde "fct" davon ausgehen, daá keine Sekunden angegeben worden sind! Diese Einschr„nkung kann man durch Verwendung von '-' umgehen. Jeden Wert, der beibehalten werden soll, kann man damit ausblenden. Alle Datums-/Zeitabgaben werden auf ihre Plausibilit„t berprft, d.h. bei Monaten > 12 oder Minuten < 0 usw. kommt eine Fehlermeldung. Es wird allerdings nicht getestet ob z.B. der Februar nun 28 oder 29 Tage hat. Jahresangaben mssen vierstellig sein! Zu diesem Utility stand brigens ein UNIX-Programm namens 'touch' Pate. BEISPIELE: fct *.c Alle 'C'-Dateien werden auf das aktuelle Datum/Zeit gesetzt. fct command.txt 12 12 1990 Die Datei 'command.txt' wird auf das Datum vom 12.12.1990 gesetzt. fct com.c - 10 - 15 Im Erstellungsdatum von 'com.c' wird der Monat auf den 10. gesetzt und die Stunde auf 15 Uhr. -> find [-abdnmstvwx] [file | device<:>][filedescriptor] -------------------------------------------------------- Es wird im kompletten Filesystem (also auch in den Unterverzeichnis- sen) nach 'file' gesucht. Startverzeichnis ist dabei normalerweise der Wurzelordner ('\'). Wird eine passende Datei gefunden, erfolgt deren Ausgabe mit Pfadna- men. Anhalten bzw. Fortfhren der Ausgabe ist durch m”glich, die Verwendung von fhrt zu einem Abbruch. EXTERNE KOMMANDOS 56 Option | Bedeutung -------+------------------------------------------------------------ a | Beginn der Suche vom aktuellen Ordner aus und nicht vom | Wurzelverzeichnis '\'. | b | Sortierung der Ausgabe in Abh„ngigkeit von der Dateigr”áe. | d | Nur Dateien mit dem Tagesdatum werden ausgegeben. Leute, die | bis in den frhen Morgen zu arbeiten pflegen, sollten be- | achten, daá sich dieses um Mitternacht „ndert. | m | Bildschirmweise Ausgabe. Also die blichen Scherze mit | , und . Hat bei Umleitung der | Ausgabe keine Wirkung. | n | Die Dateien werden nach Erstellungsdatum sortiert. Dateien | jngeren Datums kommen vor „lteren. | s | Alphabetische Sortierung nach Dateinamen. Diese Option | kann nicht gleichzeitig mit 'n' benutzt werden. | t | Nur der Ordnerbaum wird ausgegeben. Diese Option ersetzt | das alte "tree"-Kommando. Bei Verwendung in Verbindung mit | Option 'x' drfen keine Laufwerksangaben erfolgen! | v | Zu den gefundenen Eintr„gen werden zus„tzliche Angaben wie | Gr”áe, Attribut und Erstellungsdatum ausgegeben. | w | Wartet am Programmende auf einen Tastendruck. Hat bei Um- | leitung der Ausgabe keine Wirkung. | x | Absuchen aller Laufwerke/Partitions ab 'C:'. In den Such- | begriffen darf keine Laufwerksangabe vorkommen! | BEISPIELE: find *.* Dieses Kommando wrde alle Files eines Laufwerks mit den zugeh”rigen Verzeichnisnamen ausgeben. find a:*.prg Dieser Befehl gibt alle PRG-Files aus, die sich auf dem Laufwerk A befinden. find -v *.prg Es werden die gleichen Dateieintr„ge wie im vorhergehenden Beispiel ausgegeben, nur beinhaltet diese Ausgabe zus„tzliche Informationen. find -tx Ausgabe aller Verzeichnisb„ume ab Partition C. EXTERNE KOMMANDOS 57 -> format [-bhosvw] [volumelabel] --------------------------------- Mit "format" kann man Disketten im Standardformat (ein-/zweiseitig, 80 Spuren, 9 Sektoren) formatieren. Die Formatierung startet bei Spur 80. Das hat den Vorteil, daá bei einem Abbruch dieser Operation nicht alle Daten auf einer bereits benutzten Diskette verloren sein mssen. Ein Abbruch kann durch erfolgen. Wer an spezielleren Disketten-Formaten interessiert ist, sei auf die zahlreich vorhandenen Programme verwiesen. Option | Bedeutung -------+------------------------------------------------------------ b | Formatierung auf Laufwerk B durchfhren. | h | Es wird ein erweitertes Format erzeugt, d.h. es geht mehr | auf eine Diskette. Diese Option vertr„gt sich nicht mit | '-o' bzw. '-s'. | o | Ab dem Blitter-TOS wird bei einer normalen Formatierung | aus Geschwindigkeitsgrnden die Spiralisierung eingesetzt. | Dieses Vorgehen kann bei „lteren TOS-Versionen allerdings | zu Problemen fhren. Diese Option erlaubt deshalb die | 'old fashioned' Formatierweise. | s | Einseitige Formatierung durchfhren. | v | Fhrt eine zus„tzliche šberprfung durch, ob alle Sektoren | korrekt gelesen werden k”nnen. | w | Vor der Formatierung auf Tastendruck warten. | -> getfiles [-a] [-x] [-o] -------------------------------------------------------------- Dieses Programm legt alle Datei- und Ordnernamen, auf die der 'descriptor' paát, in einer Datei ab. Es entspricht damit in etwa den Kommandos "ls" und "dir", nur daá keine zus„tzlichen Informationen mit ausgegeben werden. An dieser Stelle mag der Nutzen dieser Funktion noch nicht so recht einleuchten. Man wird aber diesen, das hoffe ich wenigstens, an dem in der Einleitung bereits angesprochenen Beispiel im Abschnitt 'Ein- gabeumleitungabeumleitung' erkennen. Option | Bedeutung -------+------------------------------------------------------------ a | Angabe eines Fileatributs (in dezimal). Dadurch l„át die | Auswahl der gefundenen Eintr„ge nur auf solche beschr„nken, | mit dem anzugebendenden Attribut. | o | Normalerweise heiát die Ausgabedatei 'getfiles.dat'. Dies | kann man durch diese Option „ndern. | EXTERNE KOMMANDOS 58 x | Alle Eintr„ge mit dem anzugebenden Attribut werden igno- | riert. | BEISPIELE: getfiles *.* Alle Eintr„ge werden im File 'getfiles.dat' abgelegt. getfiles -a16 d:\juhu\*.* Alle Verzeichnisnamen im Unterverzeichnis 'juhu' auf Laufwerk D werden im File 'getfiles.dat' abgelegt. Alle Pfad- und Laufwerksanga- ben werden in den Ausgabefile bernommen. getfiles -a32 -ojuhu.dat *.* Alle Dateinamen mit Attribut 'written + closed' werden im File 'j- uhu.dat' abgelegt. getfiles *.c *.o Es k”nnen natrlich auch mehrere Deskriptoren angegeben werden! -> grep [-cefhlnvwxy] ["|']["|'] [umleitung] -------------------------------------------------------------------- (kompletter Name: generalized regular expression parser) Ich nehme an, daá es einige Leute gibt, die die Funktion dieses Programmes bereits kennen. Es dient unter UNIX (zusammen mit 'fgrep' und 'egrep') dazu, Textdateien nach bestimmten Mustern (oder vorneh- mer ausgedrckt 'regul„ren Ausdrcken') zu durchsuchen. Es gibt inzwischen eine Unmenge von Varianten auf dem Softwaremarkt, die mehr oder weniger den Funktionsumfang des Urgreps nachbilden. Ich m”chte deshalb betonen, daá das beiliegende Programm auf meinem Mist gewachsen ist und nicht von irgendwoher bernommen wurde. Ich habe mich bei der Implementierung m”glichst nahe an die Vorgaben eines gewissen Allen Holub gehalten. Leider waren diese Ausfhrungen nicht immer ganz eindeutig, so daá es durchaus sein kann, daá man zu unter- schiedlichen Resultaten bei der Anwendung meiner Version im Vergleich zu der auf UNIX-Systemen kommen kann. Durch die M”glichkeit, nach regul„ren Ausdrcken suchen zu k”nnen, sind der Konstruktion bestimmter Suchmuster praktisch keine Grenzen gesetzt. Das heiát aber leider auch, daá es durchaus sein kann, daá mir der eine oder andere Fehler durch die Lappen gegangen ist! Mel- dungen hierzu wrde ich ganz gut finden. Man sollte allerdings wirklich sicher sein, daá es sich um einen Fehlerfall handelt. Mir sind anfangs immer wieder Pseudofehler untergekommen, die ihre Ursa- che in der Angabe eines falschen regul„ren Ausdrucks hatten. Durch Verwendung von TURBO-C bleibt die Rechenzeit, die zum Abklap- pern der Dateien gebraucht wird, in einem ertr„glichen Rahmen. Das Programm holt sich s„mtlichen frei verfgbaren Speicher und benutzt diesen als Eingabepuffer fr die zu durchsuchende Dateien. Dadurch werden Lesezugriffe auf den externen Massenspeicher (Disket- te, HD oder RAM-Disk) minimiert, was sich in einer etwas niedrigeren EXTERNE KOMMANDOS 59 Suchzeit niederschl„gt. Man kann das Programm durch abbrechen bzw. durch kann die Ausgabe angehalten und wieder fortgesetzt werden. Jetzt zur Funktionsweise: Wie bereits gesagt, "grep" durchsucht Dateien nach regul„ren Aus- drcken. Je nach gesetzter Option werden dabei alle Zeilen ausgege- ben, in denen ein passender Ausdruck gefunden werden kann. Die einfachste Form einer Suche w„re z.B. grep include *.c "grep" wird hier alle 'C'-Dateien nach dem String 'include' durchsu- chen und alle Zeilen ausgeben, die diesen enthalten. Man erkennt, daá statt dem bereits beschriebenen Kommando "string" auch "grep" zur Suche nach Zeichenfolgen herangezogen werden kann. Wie man noch sehen wird, besitzt "string" den unbestreitbaren Vorteil, wesentlich einfa- cher in der Anwendung zu sein, d.h. Leute, denen diese Art der Suche ausreicht, sollten um "grep" vielleicht einen Bogen machen. Auf der anderen Seite ist die Leistungsf„higkeit dieses Tools um ein Vielfa- ches h”her (das gilt auch fr die Geschwindigkeit, in der die Suche abl„uft). Soll nach einem String gesucht werden, der Leerzeichen enth„lt, kann dies durch Verwendung von fhrenden bzw. abschlieáenden Anfhrungs- strichen bewerkstelligt werden: grep "int funktion(long x" *.c Hier erfolgt die Suche nach 'int funktion(long x' (statt '"' kann man auch "'" benutzen). Diese Suche h„tte man aber auch mit der folgenden Zeichenfolge durchfhren k”nnen: grep int\sfunktion(long\sx *.c Damit sind wir auf das erste Sonderzeichen gestoáen: '\s'. Es ent- spricht, wie man wohl unschwer bemerkt, einem Leerzeichen. In die gleiche Sparte fallen noch folgende Zeichen: \\ entspricht dem '\'-Zeichen \t entspricht dem Tabulator-Zeichen \b entspricht dem BACKSPACE-Zeichen \n entspricht dem LINE-FEED-Zeichen \r entspricht dem CARRIAGE-RETURN-Zeichen Die beiden letzten Zeichen haben in meiner Programmversion allerdings keine Bedeutung, da immer nur eine zeilenweise Betrachtung vorgenom- men wird und mit diesen Zeichen ein Zeilenabschluá markiert ist. šbrigens, jedes '\' fhrt zu einer šbersetzung in '', d.h. daá z.B. '\p' 'p' entspricht (natrlich mit den vorangehenden Ausnahmen)! Auf '\' kann aber auch direkt der Code fr ein bestimmtes Zeichen folgen. Dieser muá, entsprechend der C-Notation, dreistellig und in oktaler Form sein: grep \040\040 *.c EXTERNE KOMMANDOS 60 Der Suchstring besteht aus zwei Leerzeichen. Diese besitzen in der ASCII-Darstellung den Code 32 (dezimal) oder, wie man hier sieht, 40 in oktaler Schreibweise (da diese Zahl immer dreistellig sein muá, findet eine fhrende Null Verwendung). Dieser String wird brigens auf seine Gltigkeit hin (Oktalzahl oder nicht) abgeprft. Ziffern gr”áer 7 fhren z.B. zu einer Fehlermeldung! Folgende Zeichen haben eine besondere Bedeutung: . steht fr jedes beliebige Zeichen ^ steht fr den Zeilenanfang $ steht fr das Zeilenende Will man diese Zeichen explizit in seinem Suchstring haben, muá '\' verwendet werden! Dazu einige Beispiele: grep $ datei.txt hier werden alle Zeilen von 'datei.txt' ausgegeben, da ja jede Zeile sinnigerweise ein Zeilenende hat, allerdings fhrt grep \$ datei.txt nur zur Ausgabe der Zeilen, die ein '$'-Zeichen enthalten! grep ^$ datei.txt Dieser Ausdruck gibt alle Zeilen aus, die aus einem Zeilenanfang und einem Zeilenende bestehen. Dazwischen drfen keine Zeichen stehen. Man bekommt als Ergebnis also alle Leerzeilen. grep ^.$ datei.txt Es werden alle Zeilen ausgegeben, die aus genau einem Zeichen beste- hen. grep a..\.x datei.txt Hier paát jede Zeichenfolge, die mit einem 'a' beginnt, dem zwei beliebige Zeichen folgen. Daran schlieát sich ein Punkt an, dem ein 'x' zu folgen hat. 'abc.x' w„re also z.B. eine solche Folge. Man sollte bei diesem Beispiel den Unterschied zwischen '.' und '\.' beachten. Im ersten Fall steht der Punkt fr ein beliebiges Zeichen, im zweiten fr das Zeichen '.'! Ein weiteres Element zum Aufbau eines regul„ren Ausdrucks wird durch die Zeichenklasse dargestellt. Diese Klassen werden durch Verwendung von eckigen Klammern dargestellt. Alle dort vorkommenden Zeichen k”nnen an ein und derselben Stelle in der zu durchsuchenden Zeile stehen, um eine šbereinstimmung zu erzielen. '[xyz]' ist z.B. die Zeichenklasse, die die drei Zeichen 'x', 'y' und 'z' umfaát. grep ^[xyz]$ datei.txt Dieses Kommando gibt alle Zeilen aus, die aus einem (!) der drei Zeichen bestehn. Zeilen die unter anderem eines dieser Zeichen EXTERNE KOMMANDOS 61 enthalten werden nicht ausgegeben. Natrlich kann man Zeichenklassen auch mit festen Zeichenfolgen mischen: grep "[xyz] ist ein hbscher Buchstabe" datei.txt Folgende drei Zeilen werden, wenn sie in 'datei.txt' vorkommen, ausgegeben: x ist ein hbscher Buchstabe y ist ein hbscher Buchstabe z ist ein hbscher Buchstabe Kommen wir jetzt zu den etwas komplizierteren Zeichenklassen: [a-d] entspricht [abcd] [a-zA-Z] enth„lt alle ASCII-Buchstaben (keine Umlaute, kein 'á'!) [0-9] umfaát alle Ziffern In Verbindung mit '*' wird die ganze Sache sogar noch verrckter. Dieses Zeichen besagt, daá das vorhergehende Zeichen beliebig oft vorkommen kann, d.h. auch berhaupt nicht. grep ^[abc]*\s*xyz datei.txt Dieser Ausdruck gibt alle Zeilen aus, die mit beliebig h„ufigem Vorkommen von 'a', 'b' oder 'c' beginnen auf die eine beliebige Zahl von Leerzeichen folgt. Daran muá sich dann noch 'xyz' anschlieáen. Eine passende Zeile w„re z.B. acc xyzsdsdsd aber auch eine Zeile, die nur aus xyz besteht, erfllt das Suchkriterium. Durch '[^' (nicht zu verwechseln mit einem einfachen '^' ohne '[') werden ausschlieáende Zeichenklassen definiert. Alle Zeichen die darin enthalten sind, drfen nicht (!) vorkommen. Sie stellen also das Gegenteil zu den normalen Zeichenklassen dar. grep [abc][^\s\t][0-9] datei.txt Eine passende Zeile, muá eine Zeichenfolge enthalten, die mit 'a', 'b' oder 'c' beginnt, dann darf jedes beliebige Zeichen, auáer Blank und Tabulator, folgen. Im Anschluá daran muá noch eine Ziffer kommen. xycT2sss ist z.B. eine solche Zeile (der passende Teilstring wird durch 'cT2' dargestellt). xyc2sss wrde hingegen durchfallen, da fr '[^\s\t]' irgendetwas stehen muá (nur halt keins dieser beiden Zeichen)! EXTERNE KOMMANDOS 62 Das ist eigentlich schon alles. Es ist durch Verwendung von '\' natrlich m”glich auch nach Zeichen wie z.B. '[' zu suchen (was einfach '\[' entspricht). Durch ein direkt angeschlossenes '*' kann, wie bereits bei einzelnen Zeichen, ausgedrckt werden, daá ein beliebig h„ufiges Vorkommen gemeint ist. Wird dieses Zeichen nicht benutzt, heiát das, daá man eines braucht, daá den Test besteht oder durchf„llt! Option | Bedeutung -------+------------------------------------------------------------ c | Nur die Anzahl der passenden Zeilen wird ausgageben. | e | Wird bei Suchmuster gebraucht, die mit einem '-' beginnen. | Alternativ dazu kann man natrlich auch mit Anfhrungs- | strichen arbeiten. | f | Der regul„re Ausdruck wird der Datei entnommen, deren Namen | auf diese Option folgt. | h | Werden mehrere Dateien durchsucht, erfolgt bei einer Ausgabe | normalerweise die Angabe des Dateinamens. Dies kann mit | dieser Option unterdrckt werden. | l | Es werden nur die Dateinamen ausgegeben, die den Ausdruck | enthalten. | n | Die Zeilen werden mit ihrer Zeilennummer ausgegeben. | v | Es werden nur die Zeilen ausgegeben, auf die der regul„re | Ausdruck nicht paát. | w | "grep" wartet nach dem Suchvorgang auf das Drcken einer | Taste. | x | Diese Option sorgt fr ein komplettes Absuchen einer Parti- | tion (bzw. Laufwerk). In der Fileangabe darf dazu kein | '\'-vorkommen. Wird nur ein Laufwerk angegeben, fgt | "grep" automatisch '*.*' an, d.h. alle Dateien werden be- | trachtet. | y | Groá- und Kleinschreibung wird gleichbehandelt. | Das letzte m”gliche Argument ist die Ausgabeumleitung. Mit diesem Thema befaát sich ein eigener Abschnitt. Ich m”chte an dieser Stelle betonen, daá "grep" genau in der angege- benen Reihenfolge mit Argumenten versorgt werden muá, die oben be- schrieben ist! Gerade was z.B. die Ausgabeumleitung angeht, ist dies bei anderen Kommandos egal, wo sie steht. grep -xl include d:*.c Alle 'C'-Dateien, die sich auf Partition D befinden, werden nach dem Vorkommen von 'include' abgesucht (Option 'x'). Ausgegeben werden nur die Dateinamen (Option 'l'). EXTERNE KOMMANDOS 63 grep -yf muster.dat *.txt Das Muster wird in diesem Fall aus der Datei 'muster.dat' genommen. Option 'y' sorgt auáerdem dafr, daá bei der Suche die Groá- und Kleinschreibung gleichbehandelt wird. Leider fhrt diese Option zu einer etwas l„ngeren Rechenzeit, da ja jeder Buchstabe erstmal umgewandelt werden muá. Das folgende Beispiel eines regul„ren Ausdrucks wird immer wieder gern zur Darstellung der Leistungsf„higkeit von "grep" herangezogen: grep -n ^[a-zA-Z_][_a-zA-Z0-9\s]*([a-z\s\*\[\]A-Z0-9_,]*)$ *.c Es soll zur Erzeugung einer einfachen Crossreference-Liste von C- Funktionen dienen. Durch '-n' wird angegeben, daá zu jeder passenden Zeile, die Zeilen- nummer ausgegeben werden soll. Die Klassifizierung zwischen den beiden ersten eckigen Klammern '[a-zA-Z_]' bedeutet, daá die zu suchende Zeichenfolge nur mit Buchstaben oder einem '_' beginnen kann. '[_a-zA-Z0-9\s]*' bedeutet, daá jetzt jede beliebiglange Zei- chenfolge, die aus Buchstaben, Ziffern , '_' oder Leerzeichen be- steht, folgen kann. Jetzt muá eine ”ffnende runde Klammer kommen. Innerhalb dieser kann, angezeigt durch '[a-z\s\*\[\]A-Z0-9_,]*' eine beliebig lange Folge, die aus Buchstaben, Leerzeichen, eckigen Klam- mern, '_', '*' oder Ziffern besteht, folgen. Jetzt muá eine schlie- áende runde Klammer und das Zeilenende folgen um einen Treffer zu erzielen. Das '^'-Zeichen am Anfang gibt an, daá diese Folge, wie bereits besprochen, nicht mitten in einer Zeile vorkommen darf. Noch ein paar kleine technische Anmerkungen zu "grep": Das Programm arbeitet zeilenweise, d.h. ein Suchmuster wird nur in einer Zeile gesucht! Jede Zeile kann maximal 180 Zeichen lang sein (inklusive Zeilenendezeichen). Das máte eigentlich immer ausreichen. Die maximale L„nge eines Suchausdrucks liegt auch bei diesen 180 Zeichen. Wird nur eine einzelne Datei abgesucht, erfolgt bei einem gefundenen Suchbegriff keine Ausgabe des Dateinamens! bricht die Suche ab, wird allerdings immer nur bei einer Ausgabe auf den Bildschirm berprft. h„lt die Ausgabe an bzw. fhrt sie wieder fort. Glckliche Besitzer von CPU-Beschleunigern kommen bei der Suchzeit voll auf ihre Kosten. Die Bildschirmausgabe dieses Kommandos kann durch die Environment- Variable 'TAB' beeinfluát werden. -> head [-number_of_lines] ------------------------------------ Dieser Befehl gibt die ersten zehn Zeilen (voreingestellt) der/des angegebenen ASCII-Files aus. Damit kann man sich auf recht einfache Weise einen šberblick von bestimmten Fileinhalten verschaffen (be- sonders fr Leute interessant, die den File-Header zur Ablage von bestimmten Informationen verwenden). Wem zehn Zeilen nicht gefallen, kann mit '-' einen Wert zwischen eins und hundert angeben. Dieses Argument kann nur einmal als Eingabepa- rameter vorkommen. Mehrmaliges Auftauchen fhrt zu einer Fehlermel- dung! Die Position spielt brigens keine Rolle, '-' kann z.B. auch EXTERNE KOMMANDOS 64 der letzte Parameter sein oder zwischen Fileangaben stehen. Mit kann die Ausgabe angehalten/fortgesetzt werden, mit erfolgt ein Abbruch. Die Bildschirmausgabe dieses Kommandos kann durch die Environment- Variable 'TAB' beeinfluát werden. BEISPIELE: head *.c Ausgabe der ersten zehn Zeilen aller 'C'-Dateien die sich im aktuel- len Ordner befinden. head e:\subdir\datei.txt Ausgabe der ersten zehn Zeilen von Datei 'datei.txt', die sich im Ordner 'subdir' auf Laufwerk E befindet. head -33 *.txt Es werden die ersten 33 Zeilen aller 'TXT'-Dateien im aktuellen Ordner ausgegeben. -> inverse [s | w] ------------------ Dieses Programm dient der Einstellung der Schrift-/Hintergrundfarbe. Der Grund fr das Verlegen dieser Funktion von den internen zu den externen Kommandos hat eigentlich weniger etwas mit der Einsparung von Speicher zu tun, sondern liegt in der Hartn„ckigkeit einiger Programme, die die Bildschirmfarbgebung umstellen, ohne den ursprng- lichen Zustand wieder herzustellen. Mit der einfachen Benutzung der entsprechenden Escape-Sequenz war es da leider nicht mehr getan. Netterweise gibt es aber im GFA-Basic einen einfachen Befehl zur Einstellung der Bildschirmdarstellung (dieses Kommandos h„tte man sich natrlich auch aus den Routinen des Betriebsystems zusammensu- chen k”nnen). Der Benutzer wird jetzt gefragt, welche Einstellung er denn haben m”chte (schwarze Schrift auf weiáem Hintergrund oder umge- kehrt). Dies kann man allerdings durch Angabe eines Arguments auch umgehen (entweder 's' oder 'w'. 's' = Schwarze Schrift, 'w' = weiáe Schrift). Es ist nur das erste Zeichen relevant. L„ngere Argumentan- gaben werden nicht mit einer Fehlermeldung geahndet, wohl aber ein erstes Zeichen ungleich 's' bzw. 'w'! Ich hoffe, daá damit jetzt allen entsprechenden Problemprogrammen die Z„hne gezogen sind. Wer nur einen invertierten Bildschirm haben m”chte, kann dazu das Programm 'inverse.tos' benutzen. BEISPIELE: inverse ScHwARz Es wird auf schwarze Schrift/weiáer Hintergrund umgeschaltet. inverse schrottplatz Auch hier wird auf schwarze Schrift/weiáer Hintergrund umgeschaltet, da fr das Programm nur das erste Zeichen relevant ist. Die Eingabe EXTERNE KOMMANDOS 65 inverse braun fhrt hingegen zu einer Fehlermeldung, weil das Zeichen 'b' nicht definiert ist. -> keyboard ----------- Ausgabe der Kommandos, die zum Edieren der Eingabe zur Verfgung stehen. Man kann dieses Kommando mit einer Ausgabeumleitung fttern. Das ist der Grund, warum die Programmdatei eine 'TTP'-Endung hat. -> lock ------- M”chte man den Rechner eine Weile angeschaltet stehen lassen, aber gleichzeitig Sorge dafr tragen, daá ihn kein anderer benutzt, so kann dies mit "lock" gemacht werden. Nach Eingabe des Kommandos wird der Benutzer aufgefordert, ein Passwort einzugeben. Zur Best„tigung muá diese Eingabe wiederholt werden. War es jedesmal das gleiche Wort, meldet der Rechner, daá er abgeschlossen ('locked') ist (ine Eingabe von an einer dieser beiden Stellen, bewirkt ein Verlassen von "lock"). Will man nun weiterarbeiten, muá einfach erneut das Passwort eingegeben wer- den. Ist es falsch, erfolgt keine Reaktion, sonst erscheint wieder der normale Prompt. Ein Knacken des Schutzes kann brigens durch die RESET-Taste oder durch einfaches Aus-/Einschalten erfolgen (klar, oder?). -> man ------------------- (kompletter Name: manual) Abklappern von 'command.txt' bis 'command' gefunden wird. Kann eine Beschreibung gefunden werden, erfolgt eine Ausgabe auf den Bild- schirm. Dieser Befehl ist als eine Erweiterung von "help" gedacht. Das ganze funktioniert nur mit 'command.txt' in der ausgelieferten Form und mit dem gleichen Dateinamen! Die Ausgabe auf den Bildschirm erfolgt seitenweise (also wieder die Scherze mit '[MORE]', , und ), ein Abbruch ist durch m”glich. Hier kommt noch die M”glichkeit hinzu, daá die Ausgabe erst bei der Beschreibung zu den Optionen des jewei- ligen Kommandos weitergefhrt wird. Dazu muá die Taste bet„tigt werden. Das funktioniert natrlich nur, wenn der Befehl auch wirklich Optionen besitzt und diese nicht schon auf dem Bildschirm stehen. Will man Beschreibungen zu mehreren Kommandos haben, muá zwischen den einzelnen Ausgaben eine beliebige Taste zum Weitermachen gedrckt werden. Das Programm orientiert sich bei seiner Suche an den '->' am Anfang einer Zeile. Die Ausgabe wird beim n„chsten Vorkommen dieser Zeichen- folge abgebrochen bzw. wenn sie nicht mehr gefunden werden kann, am Fileende. Es kann also vorkommen, daá eine Ausgabe Kapitelgrenzen berschreitet. Aber wie bereits gesagt, ein Abbruch ist ja jederzeit m”glich. EXTERNE KOMMANDOS 66 Zum Auffinden der Datei 'command.txt' benutzt "man" einen Environ- mentparameter namens 'MANUAL'. Dieser muá mit "appendenv" oder "env" explizit gesetzt werden (z.B. in der Datei 'auto.com', die beim Start von 'command.prg' abgearbeitet wird)! Das Setzen von 'MANUAL' kann beispielsweise mit folgender Befehlsfol- ge bewerkstelligt werden: appendenv MANUAL=c:\wp\docu Ich gehe dabei davon aus, daá sich 'command.txt' im Verzeichnis '\wp\docu' auf Laufwerk C befindet. 'MANUAL' muá entweder komplett groá- oder komplett kleingeschrieben werden! Durch einige kleine Žnderungen ist dieses Kommando jetzt auch mit Diskettenlaufwerken ann„hernd gut zu benutzen. Die Suchzeiten bleiben in einem einigermaáen ertr„glichen Rahmen. Schlimm wird die Sache allerdings, wenn nach einem Befehl gesucht wird, den es nicht gibt oder wenn 'command.txt' und "man" nicht zusammenpassen. In einem solchen Fall wird 'command.txt' n„mlich zweimal abgeklappert, und das dauert! In den Genuá der h”heren Geschwindigkeit kommt man nur, wenn der passende 'command.txt'-File zur passenden 'man.ttp'-Datei benutzt wird. Der Grund ist recht einfach, 'man.ttp' enth„lt Informationen, wo in dem Textfile die einzelnen Kommandobeschreibungen zu finden sind. Hat man eine 'command.txt'-Datei die jngeren Datums ist als 'man.ttp', muá man z.B. damit rechnen, daá die Sache nicht so recht zusammengeh”rt und sich auf einen zweiten Suchvorgang gefaát machen. Da sich dieser sich nur mehr an den '->' vor jedem Kommando orien- tiert und die Positionsvorgaben nicht benutzt, l„uft er natrlich hbsch langsam ab! Bei diesem Befehl ist keine Ausgabeumleitung erlaubt! BEISPIELE: man appendenv Ausgabe der Beschreibung zum Kommando "appendenv". man gosub tail cp Die Beschreibung zu den Befehlen "gosub", "tail" und "cp" werden ausgegeben. -> merge ------------------------ Dieses Kommando wird zur Verbindung von zwei ASCII-Files benutzt (man kann natrlich auch andere Dateitypen verwenden, inwiefern dies allerdings sinnvoll ist, bleibt dem Anwender berlassen). Dabei wird 'fileB' an 'fileA' angeh„ngt. 'fileB' wird nicht modifiziert! 'fileA' und 'fileB' drfen nicht die gleiche Datei darstellen, d.h. der Befehl "merge command.txt command.txt" wrde nicht funktionieren! Wird allerdings via Pfadangaben auf den gleichen File zugegriffen (d.h einmal mit Pfad, einmal ohne), merkt dies das Programm nicht und man hat dann halt ein kleines Problemchen. EXTERNE KOMMANDOS 67 BEISPIEL: merge datei1 datei2 An Datei 'datei1' wird der Inhalt von Datei 'datei2' angeh„ngt. -> newserno [-b] [drive][:] --------------------------- (kompletter Name: new serial number) Mit diesem Kommando wird einer Diskette eine neue Seriennummer gegeben. Das TOS erkennt an dieser Nummer, ob ein Diskettenwechsel stattgefunden hat oder nicht. Viele „ltere Formatierprogramme haben immer dieselbe Nummer vergeben, was bei Diskettenwechseln zu ziemlichen Problemen fhren kann! Das Argument 'drive' kann nur aus dem Buchstaben 'a' oder 'b' bestehen (nur von diesen beiden Laufwerken wird angenommen, daá sie zur Verarbeitung von Disketten dienen). Der Doppelpunkt muá nicht angeben werden. Unterbleibt die Angabe eines Arguments wird von Laufwerk A ausgegangen. Option | Bedeutung -------+------------------------------------------------------------ b | Prfsumme des Disketten-Bootsectors so anpassen, daá die | Diskette autoboof„hig wird. Ohne diese Option wird die | Prfsumme immer so gesetzt, daá von der Diskette nicht ge- | bootet werden kann! | -> od [-r[h]-b-w-l-s-f] ------------------------------------------- (kompletter Name: out dump) M”chte sich der Benutzer bestimmte Dateien in hexadezimaler Schreib- weise anschauen, so kann er dies mit Hilfe dieses Kommandos tun. Der/die File(s) werden seitenweise auf dem Bildschirm ausgegeben. Ein Abbruch kann durch Drcken von erfolgen. Der Befehl ist so ausgelegt, daá auch auf andere Laufwerke bzw. Unterverzeichnisse zugegriffen werden kann. Bei vollem Bildschirm st”át man mal wieder auf die allseits beliebte '[MORE]'-Meldung, auf die man mit der - oder -Taste reagieren sollte. Die optionalen Parameter haben folgende Bedeutungen: -r[h] : Ausgabe beginnt bei dieser Adresse ( = dezimal, h = hexadezimal). Statt Adresse k”nnte man auch von Offset sprechen. -b : Ausgabe im BYTE-Format (default) -l : Ausgabe im LONG-Format -w : Ausgabe im WORD-Format -s : Kein Warten nach 22 Zeilen ([MORE] ist abgeschaltet) -f : Bei Ausgabeumleitung werden keine Sonderzei- chen mehr ausgefiltert Diese Parameter k”nnen brigens an beliebiger Stelle stehen! Das EXTERNE KOMMANDOS 68 fhrende '-'-Zeichen muá vor jeder Option angegeben werden (um eine Unterscheidung zwischen Option und hexadezimaler Zahl herzustellen). BEISPIELE: od command.txt Gibt die Datei 'command.txt' hexadezimal aus. od \megamax\headers\*.h Hexadezimale Ausgabe aller '.h'-Dateien die sich im Verzeichnis '\megamax\headers\' befinden. od -r500-l *.c Ausgabe aller C-Dateien. Gestartet wird mit Byte 500. Das Ausgabefor- mat ist LONG. Folgende Options-/Argumentangaben h„tten die gleiche Wirkung gehabt: od -r500 -l *.c od -r500 *.c -l od -l *.c -r500 od -l-r500 *.c Und zum Abschluá noch ein Beispiel fr eine hexadezimale Offset- Angabe: od -rhab test.dat Hier wird ab Byte 'ab' ausgegeben, das entspricht 171 in dezimaler Schreibweise. -> passwd --------- (kompletter Name: password) Dieses kleine Programm ist fr Sicherheitsfreaks gedacht. Wird es aufgerufen, berprft es, ob eine Datei 'passwd.dat' existiert. Wenn nicht, fordert es vom Benutzer ein neues Passwort an und erzeugt diese Datei. Ist der File allerdings bereits vorhanden, muá der Benutzer zum Verlassen des Programms, daá in 'passwd.dat' abgelegte Passwort eingeben. Wird beim Neueinrichten eines Passwortes gedrckt, er- folgt kein Anlegen der Passwort-Datei und das Programm wird verlas- sen! Eigentlich ist das Programm fr die Verwendung im AUTO-Ordner des Bootlaufwerks gedacht. Dazu muá man die Extension von 'TOS' nach 'PRG' ab„ndern. Will man nach einiger Zeit ein neues Passwort installieren, muá dazu einfach nur die Datei 'passwd.dat' gel”scht werden. Die Minimall„nge fr ein Passwort liegt brigens bei 6 Zeichen. Vorher kommt man aus der Eingaberoutine nicht raus! Mit wird eine eingegebene Zeile komplett gel”scht und man f„ngt wieder bei 0 an, geht ein Zeichen nach links. Man kann den ganzen Mechanismus natrlich durch Verwendung eines andere Bootdevices umgehen! EXTERNE KOMMANDOS 69 -> paste [-d] ----------------------------- 'Klebt' die Zeilen der angegeben Dateien aneinander. Als Standard- Trennzeichen gilt dabei ein TAB. Durch '-d' kann aber auch ein anderes Zeichen gew„hlt werden (z.B. '-d|' fr das Oder-Zeichen oder '-d\\' fr den Backslash). In einem Durchgang kann man maximal 10 Dateien so zusammenfassen. Es gibt keine Fehlermeldung bei šberschreitung dieses Limits! Mithilfe der Ausgabeumleitung kann man das Ergebnis auch in einer Datei ablegen lassen (dazu gibt es einen eigenen Abschnitt). Vorein- gestellt ist die Ausgabe auf den Bildschirm. Dieser Befehl kann fr Leute ntzlich sein, die z.B. Tabellen zusam- menstellen mssen. -> purge [-es] [file(s)] ------------------------ Das Kommando kann zum Entfernen von Dateien benutzt werden, deren Extensions aus einer dreistelligen Zahl bestehen. Solche Files werden z.B. vom "cp"-Befehl erzeugt, wenn dieser mit Option 'o' aufgerufen wird. "purge" l”scht alle Dateien mit einer passenden Extension bis auf diejenige mit der h”chsten Zahl. Bei dieser wird die Erweiterung auf die Nummer "000" ge„ndert. Ruft man dieses Kommando ohne Argumente auf, wird das aktuelle Ver- zeichnisse auf passende Dateien hin abgeklappert, ansonsten werden nur die Files betrachtet, die der Benutzer angegeben hat. Allerdings darf bei einer solchen Argumentangabe keine Fileextension vorkommen! W„hrend der Bearbeitung eines Verzeichnisses, zeigt das Programm an, welche Dateien gerade gel”scht werden und wo Umbenennungen stattfin- den. Option | Bedeutung -------+------------------------------------------------------------ e | Kein Abbruch der Bearbeitung im Fehlerfall. | s | Unterdrckt die Bildschirmausgabe. | Noch ein Wort zur Warnung. Es gibt Programme, z.B. im grafischen Bereich, die bestimmte Datenfiles auch durch eine dreistellige Zahl nach dem Punkt im Filenamen kennzeichnen. Es w„re unter Umst„nden ziemlich fatal, wenn man hier "purge" anwendet. Dieser Befehl ist natrlich nicht in der Lage, zu sehen, um was fr eine Art von Datei es sich handelt. BEISPIEL: purge edi Entfernt alle Files der Form 'edi.XXX', wobei XXX fr eine dreistel- lige Zahl steht. Die Datei mit der h”chsten Zahl wird in 'edi.000' umbenannt. Existiert allerdings nur eine solche Datei mit Zahlextension, passiert gar nichts! EXTERNE KOMMANDOS 70 -> quickdel [drive][:] ---------------------- (kompletter Name: quick delete) L”scht das komplette Laufwerk (bzw. die Verwaltungsinformationen zu den Dateien). Wird keine Laufwerksbezeichnung angegeben, wird auf das aktuelle Bezug genommen. Es erfolgt in diesem Fall (und wirklich nur hier) eine Sicherheitsabfrage vor dem eigentlichen L”schvorgang! Leider gibt es manchmal mit der Verwaltung der FAT Probleme. Der Inhalt eines Laufwerks wurde zwar gel”scht aber "dir" zeigt immer noch (Geister-)Dateien an. Dieses Verhalten habe ich vor allem bei meiner RAM-Disk beobachtet. Ein Grund kann beispielsweise in der Zwischenspeicherung der FAT und der Directory-Informationen im RAM liegen (vgl. auch die diversen Cache-Programme, die heutzutage verwendet werden). Man muá aber immer davon ausgehen, daá s„mtliche Verwaltungsinformationen der Dateien eines Laufwerks entfernt worden sind, d.h. bei einem sp„teren Zugriff wird kein File mehr gefunden und das Laufwerk ist leer! Um weiteren Problemen aus dem Weg zu gehen, sollte man sich auf dem zu bearbeitenden Laufwerk im Wurzel-Verzeichnis befinden ehe man den L”schvorgang startet. Durch Verwendung eines sehr einfachen Batch- Files ist es ohne Komplikationen m”glich, dies zu gew„hrleisten. Der Vorteil dieses Programms gegenber "erases *.*" liegt in der Geschwindigkeit. Das 'read-only'-Attribut hat bei Verwendung von "quickdel" keinerlei Schutzwirkung! BEISPIELE: quickdel i L”schen aller Datei-Informationen von Laufwerk I. Man h„tte auch quickdel i: schreiben k”nnen. Es ist brigens nicht m”glich, mehrere Laufwerke anzugeben. Diese Einschr„nkung soll eine gewisse Schadensbegrenzung bei einer Fehleingabe gew„hrleisten. -> rev ---------------- (kompletter Name: reverse) Umgekehrte Zeilenausgabe (von rechts nach links) bei ASCII-Dateien. Die Bildschirmausgabe dieses Kommandos kann durch die Environment- Variable 'TAB' beeinfluát werden. -> save ----------------- Files, auf die dieser Befehl angewandt wird, sind nur noch lesbar. Rckg„ngig gemacht werden kann dieses Kommando mit "unsave". Man sollte beachten, daá es Programme gibt, die auf solchermaáen geschtzte Dateien mit dem frohen Werfen von Bomben reagieren. Es muá also vor Verwendung solcher Programme "unsave" benutzt werden (geht EXTERNE KOMMANDOS 71 natrlich auch mit "chmod")! -> sed <-s | -d> [-eg] ------------------------------------------------- (kompletter Name: stream editor) Mithilfe dieses sehr einfachen Editors, kann ein Benutzer in einer Datei einen String gegen einen anderen tauschen bzw. Zeilen, in denen ein bestimmter String enthalten ist, l”schen. Es kann in einem Durchgang entweder nur ein Ersetzungs- oder ein L”schvorgang statt- finden! In 'StringA' bzw. `StringB' k”nnen auch Zeichen wie beispielsweise Form-Feed oder Backspace vorkommen. Solche Steuerzeichen mssen durch ein '\' eingeleitet werden. Es gibt folgende Kombinationen: \b = Backspace \n = Line Feed \r = Carriage Return \f = Form Feed \t = Tabulator Zeichen Alle andere Kombinationen haben zur Folge, daá aus den beiden Zeichen nur das zweite bernommen wird. Aus der Folge '\-' wrde also '-' werden. Damit kann man "sed" z.B. anzeigen, daá '-' nicht als Einleitung zu einer Optionen verstanden werden soll, sondern als zum Suchstring zugeh”rig. Das '\'-Zeichen bekommt deshalb einfach durch die '\\'-Kombination. Steht '\' einzeln an letzter Position des Strings, wird es ohne Umwandlung bernommen (das letzte Zeichen bleibt also ein '\'). Die Ausgabe erfolgt standardm„áig auf den Bildschirm, kann allerdings umgeleitet werden. Die Bildschirmausgabe dieses Kommandos kann durch die Environment-Variable 'TAB' beeinfluát werden. Die Reihenfolge der Argumente muá beachtet werden, eine Ausgabeumleitung kann nur als letztes Argument vorkommen! Die Bear- beitung ist immer auf eine Datei beschr„nkt. Option | Bedeutung -------+------------------------------------------------------------ d | Entfernt eine Zeile, in der 'StringA' vorkommt. Argument | 'StringB' darf nicht angegeben werden! | s | 'StringA' wird durch 'StringB' ersetzt. Beide Argumente | mssen angegeben werden! | e | Zeilen, die nur aus Leerzeichen (Blanks, Tabulator oder nur | einen Zeilenvorschub) bestehen, werden entfernt. | g | Normalerweise wird ein L”sch-/Ersetzvorgang nur genau ein- | mal durchgefhrt. Diese Option sorgt dafr, daá der kom- | plette File bearbeitet wird. | Option 'd' und 's' drfen nicht gleichzeitig vorkommen (Fehlermeldung)! Eine dieser beiden Optionen muá allerdings angegeben werden! Im Unterschied zu anderen Kommandos, die eine Ausgabeumleitung EXTERNE KOMMANDOS 72 zulassen, ist es bei "sed" m”glich auf den zu bearbeitenden File umzuleiten. BEISPIELE: sed -d -g @@@@@@ test.c >test.c Alle Zeilen, die den String '@@@@@@' enthalten, werden aus Datei 'test.c' entfernt. sed -s "/*#define NOEDI*/" "#define NOEDI" edi.c >edi.c Kann in 'edi.c' eine Zeile gefunden werden, die '/*#define NOEDI*/' enth„lt, so wird diese Zeichenfolge durch '#define NOEDI' ersetzt. Da Option 'g' nicht gesetzt ist, erfolgt diese Ersetzung genau einmal! In beiden Beispielen wird auf die zu bearbeitende Datei umgeleitet. Man h„tte aber natrlich auch eine neue Datei angeben k”nnen. Durch Verwendung von Anfhrungszeichen ist es m”glich, Leerzeichen in den Zeichenfolgen anzugeben (wie z.B. zwischen 'define' und 'NOEDI'). Man sollte diese einfache Ausfhrung von "sed" nicht mit seinem Vorbild, der unter UNIX Verwendung findet, vergleichen. Er entstand einfach nur, um in einer Datei eine Zeile zu „ndern ohne jedesmal einen Bildschirmeditor aufrufen zu mssen. -> sort [-bdfimrtuv] [+pos] [-pos] -------------------------------------------------------- Dieses Programm kann zur Sortierung von ASCII-Dateien benutzt werden. Man sollte vielleicht ein biáchen aufpassen, daá keine Files sortiert werden, die dafr eigentlich nicht vorgesehen waren (z.B. sehen sortierte Programmsourcefiles netter aus als unsortierte, deren Nutzen bleibt allerdings fraglich). Die Ausgabe erfolgt standardm„áig auf den Bildschirm. Diese kann allerdings durch Verwendung der Ausgabeumleitung auch in eine Datei oder z.B. auf den Drucker erfolgen. Die maximale L„nge einer Zeile betr„gt 180 Zeichen. Alles was darber hinausgeht wird abgeschnitten und fehlt dann auch in der Ausgabe! Die Bildschirmausgabe dieses Kommandos kann durch die Environment- Variable 'TAB' beeinfluát werden. Ordner bzw. Laufwerke fr tempor„re Dateien mit 'SORT' (siehe Option 'm'). Ein Abbruch der Bearbeitung kann durch erfolgen, bei der normalen Ausgabe auf den Bildschirm, kann diese mit angehalten bzw. wieder fortgesetzt werden. Da das Programm zuerst den gesamten ASCII-File einliest und im RAM ablegt, kann es passieren, daá der Speicher nicht ausreicht. Tritt dieser Fehlerfall auf, bricht das Programm mit einer entsprechenden Meldung ab (mit Sortieren ist dann natrlich nichts). Diesen Punkt kann durch Verwendung von Option 'm' allerdings etwas hinausz”gern (s.u.)! Zeilentrenner werden bei der Sortierung nicht beachtet! Jede Zeile erh„lt allerdings bei der Ausgabe ein solches Trennzeichen ('Carriage-Return' und 'Line-Feed'). Im Gegensatz zu „lteren Versionen ist der eigentliche Sortiervorgang jetzt recht zgig abgeschlossen (i.a. dauert das Einlesen bzw. die Ausgabe l„nger). Benutzer von Disketten werden wegen der hohen Lese- EXTERNE KOMMANDOS 73 /Schreibzeiten in keinen Freudentaumel verfallen. Hier sollte man sich lieber mit einer RAM-Disk behelfen. Option | Bedeutung -------+------------------------------------------------------------ b | Fhrende Leerzeichen und Tabulatoren werden ignoriert. | d | Satzzeichen werden ignoriert. | f | Groábuchstaben haben gleiche Wertigkeit wie Kleinbuchstaben. | i | Nur Zeichen die im ASCII-Bereich (Code 0 - 127) liegen, | werden zur Sortierung herangezogen. | m | Die zu sortierende Datei wird erst in 10 kleinere Files | geteilt. Diesen werden dann einzeln sortiert und wieder zu- | sammengefaát. Damit ist es m”glich, auch Dateien zu sortie- | ren, deren Gr”áe normalerweise den freien Speicher ber- | schreitet. Man muá allerdings beachten, daá man es hier | nicht mit einem vollwertigen 'file merging'-Sortier- | verfahren zu tun hat, d.h. der Speicher kann einem bei | gengend groáen tempor„ren Files immer noch ausgehen! | Die erzeugten Dateien werden nach Abschluá der Sortierung | wieder gel”scht. Ein Abbruch des Programms kann aller- | dings dazu fhren, daá dies unterbleibt. Man kann sie | an ihrem Namen ('$M_SORT$.#nr') erkennen und dann selbst | entfernen. | Es ist brigens m”glich, fr diese tempor„ren Dateien ein | bestimmtes Laufwerk oder einen besonderen Ordner anzugeben. | Diese Angabe muá in der Environmentvariablen 'SORT' stehen | (vgl. dazu "env" und "appendenv"). Natrlich sollte man da- | rauf achten, daá dort gengend verfgbarer Platz fr diese | Files vorhanden ist. | Logischerweise dauert der Sortiervorgang wegen den I/O-Vor- | g„ngen erheblich l„nger. Dies h„ngt in besonderem Maá von | der Charakteristik des verwendeten Laufwerks ab. Wer seine | tempor„ren Dateien z.B. am liebsten auf Floppies einrich- | richtet, wird mit viel freier Zeit belohnt. | r | Absteigende Sortierrung (also z.B. 'b' vor 'a'). | t | Das auf 't' folgende Zeichen kennzeichnet die Trennung von | Feldern (Spalten), nach denen sortiert wird. Ohne Ver- | wendung dieser Option, werden Leerzeichen und Tabulatoren | als Trennzeichen angenommen. | u | Doppelte Zeilen werden bei der Ausgabe entfernt. | v | Es wird bei der Sortierung die jeweilige Aktion auf dem | Bildschirm angezeigt. | Zus„tzlich kann auf '-' auch eine Position angegeben werden. Diese bestimmt die Nummer des Felds/Zeichens, daá nicht mehr zur Sortierung herangezogen wird. Das Startfeld/-zeichen wird durch ein vorausgehendes Plus ('+') EXTERNE KOMMANDOS 74 gekennzeichnet. Um eine Unterscheidung zwischen Feld und Zeichennummer zu erreichen, wird '.' benutzt. Eine Zahl vor diesem Punkt kennzeichnet die Feld- nummer, eine Zahl danach die Zeichennummer. Wird keine Zahl vor dem Punkt angegeben, hat man es also z.B. nur mit der Festlegung eines bestimmten Zeichens zu tun. Fehlt der Punkt (und damit natrlich auch die Folgezahl), wird nur auf ein Feld Bezug genommen. BEISPIELE: sort -rf mix.txt >sort.txt Die Datei 'mix.txt' wird absteigend sortiert, wobei Klein- und Groábuchtaben gleich behandelt werden, in der Datei 'sort.txt' abgelegt. sort -t| +2 -3 a.dat b.dat Es wird aufgrund der 2. Spalte (getrennt durch '|') sortiert. sort xyz.txt >PRN: Ausgabe der sortierten Datei 'xyz.txt' auf den Drucker. sort +.3 -.6 text.txt Es werden zur Sortierung nur die Zeichen 3 bis 5 herangezogen. Man beachte, daá Zeichen Nummer 6 nicht dabei ist. Die Ausgabe erfolgt auf den Bildschirm. Arbeitet man jetzt noch mit einer der Filteroptionen (z.B. -i), darf nicht vergessen werden, daá in der Zeichenz„hlung die ignorierten nicht vorkommen, d.h. es werden nur die fr die Sortierung relevanten Zeichen gez„hlt! sort -d +3.5 -7.20 bsp.dat Es wird absteigend sortiert, wobei die Ausgabe auf den Bildschirm erfolgt. Zur Sortierung wird Spalte 3 bis 6 herangezogen. Hier werden dann die Zeichen beginnend mit Nummer 5 bis einschlieálich 19 betrachtet. -> split [-] [destination] ---------------------------------------- M”chte man eine ASCII-Datei in mehrere kleinere Files aufspalten, so kann dies mit "split" gemacht werden. šber 'lines' kann man die Anzahl der Zeilen bestimmen, die in den erzeugten Dateien abgelegt werden sollen. Voreingestellt ist hier 1000. Hat man also z.B. einen File, der aus 20000 Zeilen besteht, wrde "split" daraus 20 Dateien erzeugen mit jeweils 1000 Zeilen, wenn man 'lines' nicht benutzt. Diese Option kann sich brigens im Bereich von 2 bis 20000 bewegen. Wird das Argument 'destination' weggelassen, werden die Dateien mit dem hbschen Namen 'x.' versehen. Die Extension f„ngt bei 'aaa' und wird mit jedem neuen File hochgez„hlt. Das zwanzigtausendzeilen- Beispiel wrde also zu den Dateien 'x.aaa','x.aab',...,'x.aat' fhren. M”chte man einen eigenen Destinationfile angeben, sollte man EXTERNE KOMMANDOS 75 nicht vergessen, daá das Kommando die Extension auch hier selber setzt, d.h. wird eine solche angegeben, hat sie keinen Einfluá auf die entstehenden Dateien (wird also ignoriert). Die Quelldatei darf eine Pfadangabe enthalten, bei der Zieldatei ist dies nicht zul„ssig. Wildcards fhren in beiden Angaben zu einer Fehlermeldung. Es erfolgt keine Modifikation oder L”schung der Quelldatei! Man kann das Programm brigens durch šberschreiten der Extension 'zzz' zum Absturz bringen. Das kann man natrlich abfangen, aber wer soviele Dateien anlegen will ist selber schuld. Da der Fall erst bei ber 17500 Files eintritt, ist das ganze wahrscheinlich rein akade- misch zu sehen. BEISPIEL: split -50 command.txt Die Datei 'command.txt' wird in mehrere Dateien aufgespaltet, die jeweils fnfzig Zeilen umfassen. Die Filenamen beginnen dabei mit 'x.'. -> sum [-d] --------------------- Bestimmt zu den angegebenen Dateien eine Prfsumme. Damit l„át sich ein relativer einfacher Virenschutz einfhren. An der Prsumme kann man erkennen, ob sich eine Datei ver„ndert hat. Gibt es fr eine solche Ver„nderung keine Erkl„rung, muá man mit einem Linkvirus rechnen. Aber bitte nicht vergessen, es gibt Programme, die sich selbst modifizieren (z.B. TEMPUS-Anpassungen). Dort muá man nicht zwangsl„ufig von einem Virusbefall ausgehen. Option | Bedeutung -------+------------------------------------------------------------ d | Das Erstellungsdatum wird in die Prfsumme miteinbezogen. | BEISPIELE: sum *.ttp *.prg Es werden erst die Prfsummen zu allen existierenden 'TTP'-Dateien berechnet, dann die Werte fr alle im aktuellen Ordner vorkommenden 'PRG'-Files. sum -d *.ttp *.prg Das gleiche wie im vorhergehenden Beispiel, nur diesmal mit Berck- sichtigung des Erstellungsdatums. -> tab [tab_width] ---------------------------- (kompletter Name: tabulator) Dieses kleine Programm ist fr Leute gedacht, die mit einem Editor arbeiten, der sich weigert, vernnftig mit TAB-Zeichen umzugehen (z.B. die alten Versionen von TEMPUS) und die nun auf einen umsteigen EXTERNE KOMMANDOS 76 m”chten, der diese Kunst beherrscht. In den anzugebenden Dateien wird versucht, fhrende Leerzeichen (und nur die) zu Tabulatorzeichen zusammenzufassen (vgl. auch "enttab"). Mit 'tab_width' kann die gewnschte Tabulatorweite eingestellt werden (von 2 - 9). Unterbleibt dies, wird sie auf 8 Zeichen gesetzt. Die Ausgabedateien haben die Endung '.TAB'. -> tail [-number_of_lines] ------------------------------------ Das analoge Kommando zu "head", nur wird diesmal das Ende einer ASCII-Datei ausgegeben. Der Benutzer kann dabei angeben, wieviel Zeilen er, vom Ende aus gez„hlt, auflisten lassen will (voreinge- stellt ist 10). Der Maximalwert betr„gt hier 100, der Minimalwert 1. Es ist nur einmal m”glich, einen '-'-Parameter anzugeben, der aller- dings an beliebiger Stelle stehen kann. Werden mehrere benutzt, erfolgt eine Fehlermeldung. Diese Fehlermeldung erscheint auch bei Bereichsberschreitungen/-unterschreitungen. Da sich das Programm dynamisch die gesetzte Anzahl von Zeilen merkt, kann es vorkommen, daá es bei Systemen, die speicherm„áig im roten Bereich laufen, zu Problemen bzw. zu einem Abbruch kommt. Da der Speicherplatz fr unben”tigte Zeilen allerdings immer wieder freige- geben wird, drfte dieser Fall eigentlich nur sehr selten eintreten. Mit kann die Ausgabe angehalten/fortgesetzt werden. Mit wird das Programm abgebrochen. Die Bildschirmausgabe dieses Kommandos kann durch die Environment- Variable 'TAB' beeinfluát werden. BEISPIELE: tail -20 *.c Ausgabe der letzten zwanzig Zeilen aller vorhandenen C-Dateien im aktuellen Verzeichnis. tail datei.txt Ausgabe der letzten zehn Zeilen der Datei 'datei.txt'. -> trans [-t] --------------------------------- (kompletter Name: transform) Mit diesem kleinen Utility-Programm kann man Zeichen in Dateien durch andere Zeichen ersetzen. Findet man z.B., daá eine Datei statt klein- geschriebenen ''s lieber nur groáe haben sollte, so kann man diese Umwandlung mit "trans" durchfhren. 'dat_file' enth„lt die Zeichen, die umgewandelt werden sollen und die dafr zu setzenden Codes. Wird diese Datei nicht angegeben, nimmt das Programm automatisch den File 'trans.dat' an. Fehlt dieser, erfolgt eine Fehlermeldung. Der Aufbau der Umwandlungstabelle ist recht einfach gehalten, die erste Angabe eine Zeile bestimmt das umzuwandelnde Zeichen, alle Folgeangaben in dieser Zeile werden dann bei der Umwandlung fr dieses Zeichen ausgegeben. Die Beschr„nkung, daá pro Zeichen nur genau ein anderes ausgegeben werden kann existiert nicht mehr! Man muá nur beachten, daá die Angaben pro Zeichen in einer Zeile stehen EXTERNE KOMMANDOS 77 und durch Leerzeichen getrennt sind. Die Angabe eines Zeichens kann auf folgende Arten erfolgen: - dezimal (Beispiel: 64) - hexadezimal (Beispiel: $40) - oktal (Beispiel: o100) - bin„r (Beispiel: %101) - in Anfhrungszeichen (Beispiel: '@') Das gilt fr alle Angaben (nicht nur fr die erste)! Eine Datei 'trans.dat', die statt '@' das Wort 'Klammeraffe' ausgibt und alle 'Ž' in '„' umwandelt k”nnte z.B. so aussehen: 64 'K' 'l' 'a' 'm' $6d 'e' 'r' 'a' 'f' 'f' 'e' 'Ž' '„' Die Ausgabe erfolgt standardm„áig auf den Bildschirm. Durch Verwen- dung der Ausgabeumleitung, kann man diese allerdings in eine Datei oder z.B. direkt auf den Drucker schicken. Die Bildschirmausgabe dieses Kommandos kann durch die Environment- Variable 'TAB' beeinfluát werden. -> unsave ------------------- Files, die nur lesbar sind, also nicht gel”scht werden k”nnen, entschtzt man durch dieses Kommando. Der umgekehrte Befehl ist "save". M”chte man weitergehende Dateiattribut„nderungen vornehmen, muá "chmod" benutzt werden. BEISPIEL: unsave *.prg *.ttp Bei allen 'PRG'- und 'TTP'-Dateien wird das 'read-only'-Attribut zurckgesetzt (wenn es gesetzt war). Damit sind diese Files wieder l”schbar. -> wc [-clw] ---------------------- (kompletter Name: word count) Interessiert man sich fr die Anzahl von Zeichen, Zeilen und Worte eines Files, so findet dieser Befehl Verwendung. Alles in allem kein besonders wichtiges Kommando. Es gibt keine šberprfung, ob es sich bei den zu untersuchenden Dateien um ASCII-Files handelt. Man kann also auch Programm-Dateien damit untersuchen lassen. Inwieweit dies allerdings sinnvoll ist, bleibt dem Geschmack des Benutzers berlassen. Option | Bedeutung -------+------------------------------------------------------------ c | Ausgabe auf die Anzahl der Zeichen beschr„nkt. | l | Ausgabe auf die Anzahl der Zeilen beschr„nkt. | EXTERNE KOMMANDOS 78 w | Ausgabe auf die Anzahl der Worte beschr„nkt. | BEISPIEL: wc *.c Untersuchung aller vorhandener 'C'-Dateien. -> wipeout [-s] [:] ----------------------------- "wipeout" l”scht ein Laufwerk und initialisiert alle Daten-Cluster mit dem Wert E5 (hexadezimal), d.h., daá man nach Ausfhrung dieses Kommandos ein leeres Laufwerk hat und nicht mehr erkennen kann, was fr Daten es enthielt. Das Programm ist also fr Sicherheitsfreaks gedacht. Option | Bedeutung -------+------------------------------------------------------------ s | Unterdrckt die Sicherheitsabfrage von "wipeout". | BEISPIEL: wipeout d e f Es werden die Laufwerke D - F gel”scht. Die Angabe eines Doppelpunkts nach den Laufwerksbezeichnungen ist zul„ssig aber nicht notwendig. Bei Anwendung des Programms auf Disketten wird brigens auch eine neue Seriennummer fr diese erzeugt! -> wordtext [1st-wordplus-file] ------------------------------- Dieses in GFA-BASIC V3.0 geschriebene Utility-Programm erlaubt die Umwandlung von WORDPLUS-Dateien in normale Textdateien. Es gibt zwar die M”glichkeit in WORDPLUS Dokumente als normale Textdateien abzulegen, leider gehen dabei aber alle Formate verloren. 'wordtext' dagegen wertet diese Informationen aus, d.h. es wird eine Datei erzeugt, die sowohl Seiten (getrennt durch ) mit Nummerierung als auch Blocksatz (falls eingeschaltet) enth„lt. Diese Einteilung entspricht der des Originaldokuments. Ruft man dieses Programm ohne Argument auf, erscheint eine Fileselec- torbox. Der Initialwert dieser Box kann durch die Datei 'wordtext.dat' gesetzt werden (siehe beiligende Datei). Wird das Programm alllerdings mit einem Parameter aufgerufen, kann es zu einem Problem kommen. Da es sich hier um ein GFA-BASIC V3.0 Programm handelt, findet die Endung '.PRG' Verwendung, d.h. aber, daá durch die eingebaute Pfadsuche (vgl. "path" und "on / off 3") ggf. ein (unerwnschter) Wechsel des Ordners vorgenommen wird. Dies kann zur Folge haben, daá der zu bearbeitende 'DOC'-File nicht gefunden wird. Es gibt jetzt zwei M”glichkeiten, dieser Funktionsweise zu begegnen. Einmal kann man durch "off 3" die Pfadwechselei bei '.PRG'-Dateien abstellen, dies ist im Normalfall allerdings weniger empfehlenswert; die zweite M”glichkeit ist, sich ein Alias zu schreiben, daá den Pro- EXTERNE KOMMANDOS 79 grammaufruf durch eine komplette Pfadangabe vornimmt (man kann natrlich auch ohne Alias arbeiten und immer den kompletten Pfad angeben). Befindet sich WORDTEXT.PRG beispielsweise im Ordner 'e:\util\', k”nnte man sich ja das Alias 'wordtext' basteln, daá dann beim Aufruf durch 'e:\util\wordtext.prg' ersetzt wird. Wie man mit dieser ganzen Alias-Chose umgeht, steht im brigen im n„chsten Kapi- tel. Ein direkter Aufruf geht natrlich auch, z.B. so: Angenommen 'wordtext.prg' befindet sich auf Laufwerk D im Ordner 'extcom', man k”nnte das Programm dann von anderen Verzeichnissen aus mit 'd:\extcom\wordtext' aufrufen, ohne einen Pfadwechsel zu provo- zieren. Das Problem wrde dann nicht auftreten. Noch eine kleine Anmerkung am Rande, wird mit einer 'wordtext.dat'- Datei gearbeitet, die einen Pfad enth„lt, den es gar nicht gibt, hat man das Vergngen, auf eine entsprechende Fehlermeldung zu stoáen. -> xref ----------------- (kompletter Name: crossreference) Mit diesem kleinen Programm kann man sich Crossreference-Listen von C-Dateien erstellen lassen. Ich habe mich dabei an TURBO-C gehalten was Schlsselw”rter und die nicht vorhandene M”glichkeit von ASM- Direktiven anging, d.h. inwieweit das Tool mit anderen C-Dialekten arbeitet, muá man selber testen. Stichprobenartig bin ich mal ber einige der Quelldateien zu SOZOBON-C und MicroEMACS gegangen. Es scheint dort keine Probleme zu geben. Mit den Sourcefiles zum Interpreter z.B. wird "xref" gar nicht glck- lich, alldieweil die C-Files mit ASM-Teilen, die alles durcheinander bringen, nur so gespickt sind. Als Faustregel kann wohl gelten, daá man sich an reinen C-Code halten sollte! Ich bernehme aber keine Garantie, daá die angegebenen Zeilennummern im Crossreference-Listing korrekt sind. Die erstellten Dateien haben brigens die Endung '.XRF'. Die Bedeu- tung der enthaltenen Informationen ist wohl ziemlich offensichtlich, so daá ich darauf nicht n„her eingehe (einfach mal einen 'XRF'-File anschauen). ALIAS 80 IV. Die ALIAS-Einrichtung ========================= i) Einfhrung ------------- Der Kommandointerpreter bietet dem Benutzer die M”glichkeit, be- stimmte Befehle umzubenennen. Wird zum Beispiel ”fters ein spezielles Programm mit ungemtlich langer Pfadangabe aufgerufen, so kann man diesen Aufruf durch einen krzeren ersetzen. Sei das Programm 'xcompiler.prg' immer wieder aufzurufen, kann dieses Kommando z.B. in 'cc' umbenannt werden (sinnigerweise gehe ich in diesem Beispiel davon aus, daá dieser omin”se 'xcompiler' ein C- Compiler ist. 'cc' w„re sonst ein recht verwirrender Name). Wird ein Editor ”fters zum Edieren eines bestimmten Files aufgerufen (bei einer Programmerstellung passiert dies eigentlich dauernd), kann der normale Aufruf 'e:\bin\editor.prg file' einfach in einen krzeren, z.B. 'edit', umbenannt werden. Schreibfaule Naturen und Leute, die mit der Namensgebung der Inter- preterkommandos nicht besonders glcklich sind, k”nnen durch diesen Mechanismus ihre eigene Nomenklatur aufbauen. Es gibt allerdings eine Reihe von Schlsselw”rter (z.B. "else"), die dann nicht mehr korrekt erkannt werden! Es steht bei den einzelnen Befehlsbeschreibungen immer dabei (hoffentlich), wenn eine Umbenennung nicht m”glich ist. Eine anderer Grund fr die Verwendung eines Alias wurde ja bereits beim externen Kommando "wordtext" angesprochen, das Umgehen des Pfadwechsels bei 'PRG'-Dateien (dazu gibts am Ende dieses Abschnitts noch ein Beispiel aus dem wirklichen Leben). S„mtliche Umbenennungen k”nnen im File 'alias.dat' abgelegt werden. Diese Datei wird zum Programmbeginn von 'command.prg' eingelesen (soweit vorhanden natrlich). Dies funktioniert allerdings nur, wenn sich diese Datei im gleichen Verzeichnis wie der Interpreter befin- det! 'alias.dat' wird brigens beim Verlassen von 'command.prg' nicht automatisch abgespeichert (vgl. dazu "savealias"). Man kann diese Datei natrlich mit jedem Texteditor bearbeiten, dabei muá allerdings beachten werden, daá der Interpreter irgendwelche Leerzeilen in 'alias.dat' berhaupt nicht sch„tzt. Er verw”hnt dann den Benutzer mit einer Fehlermeldung, die etwas von fehlenden Argu- menten erz„hlt. Dieses Problem kann dadurch umgangen werden, daá man die Bearbeitung der Alias-Eintr„ge nur mit den dafr vorgesehenen Kommandos vornimmt. Der Vorteil der Verwendung einer solchen Datei liegt auf der Hand, alternative Kommandonamen k”nnen sofort nach Programmstart genutzt werden und mssen nicht zu jeder Sitzung neu eingegeben werden! Es ist natrlich m”glich, ganz ohne 'alias.dat' auszukommen und die Erzeugung der Umbenennungen durch einen Batch-File vorzunehmen. Der bequemere Weg erscheint mit jedoch die Verwendung dieser Datei zu sein. ALIAS 81 ii) ALIAS-Befehlssatz --------------------- -> alias [-m] [string(s)] ------------------------- Aufzeigen aller aktuell gltigen Umbenennungen und ihrer Žquivalente. Es ist auch die selektive Auswahl eines Eintrags (bzw. mehrerer) m”glich. Option | Bedeutung -------+------------------------------------------------------------ m | Einschalten des [MORE]-Mechanismus | šbrigens kann man sich mit die Eintipperei von "alias -m" sparen. -> delalias ------------------ (kompletter Name: delete alias) L”schen eines Alias-Eintrags aus der Alias-Liste. -> getalias ----------- Der File 'alias.dat' wird mit diesem Kommando eingelesen. Diese Datei muá sich dabei in dem Verzeichnis befinden, von dem aus der Interpre- ter gestartet wurde. Dieses Kommando braucht man eigentlich nur, wenn man verschiedene Žnderungen an den eingelesenen ALIAS-Eintr„gen vorgenommen hat und nun wieder zum Urzustand zurck m”chte. Voraussetzung ist dabei natrlich, daá der ursprngliche 'alias.dat'-File nicht berschrieben wurde. -> newalias ----------------------- Umbenennung von 'old' in 'new'. Dieser Befehl dient zur Alias-Erzeu- gung. Da es m”glich ist, Alias-Verkettungen zu erzeugen, d.h. ein Alias bezieht sich auf einen anderen usw. bis man schluáendlich zum eigent- lichen Befehl kommt, kann es manchmal vorkommen, daá sich eine unendliche Schleife bei der Alias-Ersetzung bildet (ein bestimmter Eintrag fhrt wieder auf sich selbst zurck). Um hier ein H„ngenblei- ben des Rechners zu verhindern, wird nach 100 Alias-Ersetzungen abgebrochen und eine Fehlermeldung ausgegeben. BEISPIELE: newalias cc xcompiler.prg Die Beschreibung steht eigentlich schon in dem obigen Blabla. Jede Eingabe von 'cc' wird duch 'xcompiler.prg' ersetzt. newalias al alias ALIAS 82 Statt "alias" fhrt nun auch "al" zum Aufzeigen der Alias-Eintr„ge. newalias ringleitung ringleitung Das ist der einfachste Fall einer zyklischen Alias-Verkettung. Wie man leicht erkennt, wrde der Computer ohne ein Abbruchkriterium in einer Schleife h„ngenbleiben, aus der man nur durch einen RESET wieder rauskommt. Deshalb wird nach 100 Ersetzungen abgebrochen und eine Fehlermeldung ausgegeben. -> savealias ------------ Abspeichern der gltigen Umbenennungen im File 'alias.dat'. Es muá beachtet werden, daá dieses Ablegen der Datei bei Verlassen des Interpreters nicht automatisch erfolgt! Man kann sich aber mithilfe eines Batch-Files eine Enderoutine schreiben, die man zum Verlassen des Interpreters aufruft und die "savealias" enth„lt. Die Datei wird immer in dem Verzeichnis abgelegt, von dem aus 'command.prg' gestartet worden ist! Das Beispiel aus dem wirklichen Leben: Der Sourcecode zum Interpreter besteht aus drei Dateien, die ich normalerweise auf Laufwerk D im Wurzelverzeichnis in der Mache habe. Als Editor verwende ich unter anderem TEMPUS, der in einem Unterver- zeichnis namens 'extcom' rumgeistert. TEMPUS ist nun ein Programm mit der Extension 'PRG'. Da ich prinzipiell die Pfadwechselei immer eingeschaltet habe und bei den zu durchsuchenden Verzeichnissen 'd:\extcom' ganz dick dabei ist, wrde die Eingabe von TEMPUS natr- lich einen solchen Wechsel ausl”sen. Bin ich jetzt also in 'd:\' und will die Datei 'command.c' bearbei- ten, wrde der Aufruf "tempus command.c" zu der netten Frage des Editors fhren, ob ich denn da wohl eine neue Datei anlegen will. Der Grund ist ganz einfach, 'command.c' existiert zwar in 'd:\' aber nicht in 'd:\extcom' und dort befinde ich mich durch den Pfadwechsel. Durch newalias tempus d:\extcom\tempus.prg bin ich aber alle diese Sorgen los, denn die komplette Pfadangabe im aufrufenden Kommando sorgt jetzt dafr, daá kein Pfadwechsel mehr stattfindet. Leider funktioniert die Sache allerdings nur bei 'PRG'- Dateien, die keine anderen Dateien zur eigenen Lauff„higkeit brauchen und diese deshalb nachladen bzw. keine eigenen impliziten Pfadangaben zum Auffinden solcher Dateien haben (wie z.B. PKS-Edit). HISTORY 83 V. Die History-Einrichtung ========================== i) Einfhrung ------------- Der Interpreter bietet die M”glichkeit, bereits eingegebene Befehle auf einfache Weise erneut aufzurufen. Ein einfaches Beispiel soll die praktische Anwendung dieser F„higkeit aufzeigen. Zur Codierung eines Programms in C, PASCAL usw. sind i.a. die folgenden Schritte notwendig: Edieren -> Compilieren -> Linken -> Probelauf Meist erfolgt zwischen Compilieren und Linken noch eine Kurzvisite beim Editor oder nach einem bombigen Probelauf der Aufruf eines Debuggers, weil halt doch noch ein kleiner Fehler im Sourcecode aufgetaucht ist. Die Kommandos fr das Beispiel seien nun folgende: 77>ed bsp.pas Bedeutung: Aufruf des Editors zur Bearbeitung des Files 'bsp.pas'. 78>pas bsp.pas Bedeutung: Aufruf des Compilers zur Objektfileerzeugung. Sollten jetzt Fehlermeldungen aufgetaucht sein, geht's wieder zurck zum Editor. Also wieder 79>ed bsp.pas reinklopfen etc. Bevor es jetzt weitergeht, sollte ich vielleicht verraten, daá die Zahlen vor den Beispieleingaben vom Interpreter geliefert werden. Dieser kleine Hinweis ist fr das weitere Verst„ndnis ziemlich hilf- reich! Durch die Historyeinrichtung gengt es, wenn der Benutzer bei Befehl Nr. 79 ("ed bsp.pas") einfach nur "!77" eingibt. Es wird dann das Kommando mit der Nummer 77 erneut ausgefhrt. Es kann aber nicht nur ber die Kommandonummern auf zurckliegende Eingaben Bezug genommen werden, die Eingabe "!e" h„tte auch zum Wiederaufruf des Editors gefhrt, d.h. es wird bei dieser Eingabe nach dem letzten Kommando gesucht, daá mit dem Buchstaben 'e' begonnen hat, und, falls es gefunden werden kann, erfolgt ein erneuter Aufruf des nun expandierten Befehls (hier w„re dies "ed bsp.pas"). Die M”glichkeit, alte Kommandos ber den Anfangsbuchstaben zurckzu- holen, ist nicht auf einen Buchstaben begrenzt. Es wird nach dem letzten Kommando gesucht, daá mit dem eingegebenen Teilstring bereinstimmt. Ein weiteres Beispiel soll das verdeutlichen: HISTORY 84 Hat der Benutzer krzlich den Befehl "cp afile bfile" eingegeben und auf diesen Befehl folgend das Kommando "cmp afile bfile", so wrde durch "!c" der "cmp"-Befehl erneut aufgerufen werden. Durch Eingabe von "!cp" wrde aber ein eindeutiger Bezug auf den Kopierbe- fehl geschaffen und dieser ausgefhrt. Es ist also m”glich, durch beliebig lange Teileingaben eindeutige Zuordnungen zu vorhergehenden Befehlen zu bilden. Es sei darauf hingewiesen, daá sich in der History-Liste nur die letzten fnfzig Befehle befinden und daá man nur diese erneut durch die History-Kommandos aufrufen kann. Jede Neueingabe wird in diese Liste eingetragen, dafr wird der „lteste Eintrag entfernt. Diese Eintragung unterbleibt allerdings, wenn der zuletzt aufgenommene History-Eintrag mit der neu eingegebe- nen Kommandozeile identisch ist, d.h. wer z.B. viermal hintereinander "dir" eingibt, findet nur einen entsprechenden History-Eintrag. Das bisher Gesagte m”chte ich mit einem weiteren Beispiel noch etwas veranschaulichen: 120>cp afile bfile 121>cmp afile bfile 122>!c 123>!cp 124>!121 Es werden wieder "cp" und "cmp" verwendet. Die Kommandos 120 und 121 máten eigentlich klar sein. Kommando 122 ruft das letzte Kommando auf, daá mit dem Buchstaben 'c' begann auf, in diesem Fall "cmp". Kommando 123 ruft den letzten Befehl auf, der mit den Buchstaben 'cp' beginnt, und das ist Kommando 120. Befehl 124 bezieht sich nun explizit auf ein Kommando, den "cmp"-Befehl. Durch die Verwendung von und hat der Benutzer eine andere M”glichkeit auf alte Befehle zuzugreifen. sorgt fr ein Zurckbl„ttern, fr ein Vorw„rtsbl„ttern. Die Modifikation dieser Eingaben verh„lt sich analog zu den gegebe- nen M”glichkeiten bei der Kommandozeile. Kommandos aus Batch-Dateien werden nicht in die History-Liste bernommen! Beim Verlassen des Interpreters wird diese Befehlsliste in der Datei 'history.dat' abgelegt. Dieser File wird beim Start von 'command.prg' eingelesen, so daá diese Befehle sofort wieder zur Verfgung stehen. Das automatische Ablegen der History-Datei kann durch Rcksetzen von Flag 6 ("off 6") ausgeschaltet werden. Durch Rcksetzen von Flag 1 ("off 1") wird der Interpreter veranlaát, keine Kommandos mehr in diese Tabelle zu bernehmen. Der Prompt erscheint dann in inverser Darstellung. HISTORY 85 ii) Die !-Befehle ----------------- -> h [-m] [string] ------------------ (kompletter Name: history) Dieser Befehl gibt alle in der History-Liste stehenden Eintr„ge auf den Bildschirm aus. Diese Ausgabe kann auf die Eintr„ge beschr„nkt werden, die mit 'string' beginnen. Option | Bedeutung -------+------------------------------------------------------------ m | Einschalten des [MORE]-Mechanismus. | -> ! -------- Hier wird das Kommando mit der Nummer 'nr' noch einmal aufgerufen. In Verbindung mit der Historyfunktion "!" muá an dieser Stelle leider auf einen Schwachpunkt hingewiesen werden! Programme, die mit einem Ziffernstring beginnen und die nun durch "!" erneut aufgerufen werden sollen, kommen nicht zur Ausfhrung (bzw. nur dann, wenn zuf„lligerweise Ziffernstring und Kommandonummer bereinstimmen), d.h. diese Zahlen werden vorzugsweise als Bezug auf die Nummer einer alten Eingabe verstanden. Die Verwendung von zwei Ausrufezeichen umgeht dieses Problem. Ein Beispiel soll das noch etwas transparenter machen: 101>1.prg 102>!!1 103>!1 Kommando 101 ruft ein Programm '1.prg' auf, 102 wiederholt diesen Aufruf. Nummer 103 fhrt zu einer Fehlermeldung, da der Befehl mit der Nummer 1 (hier keine Referenzierung auf '1.PRG'!) nicht mehr in der History-Tabelle vorhanden ist. -> ! ------------ Es soll das letzte Kommando gestartet werden, das mit 'string' beginnt. Man beachte die beim vorhergenden Kommando angesprochene Restriktion dieses Befehls! -> !! ----- Die letzte Eingabe wird wiederholt bzw. Bezuge auf Kommandos mit fhrenden Ziffern. BATCH-PROCESSING 86 VI. Das Batch-Processing ======================== i) Einfhrung ------------- Dieser Abschnitt befaát sich mit einer der praktischsten M”glichkei- ten die der Interpreters bietet, dem Abarbeiten von Batch-Files. In einer Batch-Datei kann prinzipiell jedes der bisher besprochenen Kommandos stehen. Es gibt noch eine ganze Reihe weiterer Befehle, die den Ablauf innerhalb eines solchen Files steuern (z.B. Sprungmarken oder Schleifenkonstrukte). Es ist m”glich, solche Dateien mit bestimmten Parametern aufzurufen. Viele der folgenden Befehle sind nur in Verbindung mit Variablen sinnvoll bzw. einsetzbar. Es ist daher vielleicht ganz ratsam, sich das nachfolgende Kapitel, daá sich mit den M”glichkeiten, die im Umgang mit Variablen bereitgestellt werden, befaát, parallel zu diesem anzuschauen. Um die Programmierung des Interpreters nicht unn”tig zu verkomplizie- ren, ist die Syntax dieser Kommandos relativ einfach gehalten. Da- durch sind leider einige der Befehle bzw. ihre Parametrisierung etwas kryptisch geworden. Wird in einem Batch-File viel gesprungen, bzw. finden Schleifendurch- l„ufe statt, sollte der File in einer RAM/Hard-Disk abgelegt und gestartet werden. Das bringt zum einen einen ziemlichen Zeitgewinn und nutzt auf der anderen Seite die Diskette nicht so ab. Man darf nie vergessen, daá sich die Abarbeitung einer solchen Datei und das Wort 'pfeilschnell' nicht so besonders vertragen! Ich m”chte es nicht unerw„hnt lassen, daá der Interpreter eine Batch-Datei nicht auf einmal einliest und dann ausfhrt, sondern Kommando fr Kommando holt (bzw. Zeile fr Zeile). Die Abwicklung einer solcher Datei kann jederzeit durch abgebrochen werden! Durch gr”áere Modifikationen an der internen Tastaturpufferung des Interpreters, funktioniert dies inzwischen recht befriedigend. Durch Setzen eines Flags kann eine Batch-Datei im Single-Step Modus ausgefhrt werden. Dieses Flag wird durch "on 15" gesetzt und durch "off 15" wieder gel”scht. Normalerweise ist es nicht gesetzt. Ist dieser Modus eingeschaltet, wird in der oberen linken Bildschirmecke die aktuelle Zeilennummer innerhalb der Batch-Datei angezeigt. Ein Weitergehen zum n„chsten Kommando erfolgt durch Drcken einer Taste. bricht den ganzen Vorgang ab. Flag 13 gibt an, ob die gerade zu bearbeitende Kommandozeile in einer Batch-Datei auf dem Bildschirm angezeigt werden soll ("on / off 13"). Voreingestellt ist eine Ausgabe dieser Kommandos, d.h. das Flag ist gesetzt. Die Ausgabe des aktuellen Kommandos kann man auch durch voranstellen eines '~'-Zeichens unterdrcken. Dieses Zeichen muá an erster Stelle in der Zeile stehen und ist in seiner Wirkung auf diese beschr„nkt! Befindet sich im Verzeichnis, von dem aus 'command.prg' aufgerufen wurde, die Datei 'auto.com', so werden die darin enthaltenen Befehle BATCH-PROCESSING 87 beim Start des Interpreters ausgefhrt. Man kann allerdings den Interpreter auch mit Angabe eines Batch-File-Namens starten, dann wird dieser File beim Start abgearbeitet. Befehle eines Batch-Files werden, wie bereits im Abschnitt ber den History-Mechanismus angesprochen, nicht in die History-Liste aufge- nommen! Die im folgenden beschriebenen Befehle k”nnen zum Teil auch im Direktmodus eingegeben werden, dies ist allerdings bei einigen Kommandos nicht sehr sinnvoll. ii) Befehlssatz --------------- -> ; [Kommentar] ---------------- Durch ";" werden Kommentarzeilen eingeleitet, die keinerlei Befehls- funktion haben und nur zum besseren Verst„ndnis einer Batch-Datei beitragen sollen. ";" kann brigens auch nach einem Befehl stehen, alles vor dem Semikolon wird ausgefhrt, alles danach wird ignoriert. Diese Markierung von Kommentarbereichen funktioniert nur in Batch- Dateien; wird im Direktmodus versucht eine Kommentarzeile einzugeben, so wird diese wie eine normale Zeile aufgefaát, d.h. es drfte wohl zu einer Fehlermeldung kommen. Da es Programme gibt, die das ';'-Zeichen in der Argumentzeile erwar- ten (z.B. METAFONT), kann man diesen Mechanismus durch Rcksetzen von Flag 11 abschalten ("off 11"). -> ?arg ----------------------------------- Wurde ein Batch-File mit dem Argument versorgt, so wird der Befehl 'command' ausgefhrt (eine '$0'-berprfung wird z.B. durch "?arg 0 " repr„sentiert). Auf die Bedeutung von '$' wird beim "batch"-Kommando eingegangen. BEISPIELE: ?arg 1 goto arg_gibts Wenn in einer Batch-Datei '$1' vorhanden ist, wird zur Marke 'arg_gibts' gegangen. ?arg 0 cp $0 h: Falls Argument '$0' vorhanden ist, wird der Kopierbefehl ausgefhrt. -> ?batch [-s] -------------- Gibt, die Anzahl der gerade laufenden Batch-Dateien aus. Es k”nnen maximal zwanzig Batch-Dateien gleichzeitig offen sein. BATCH-PROCESSING 88 Option | Bedeutung -------+------------------------------------------------------------ s | Unterdrckt die Bildschirmausgabe. | Nach Aufruf dieses Kommandos findet sich diese Anzahl auch in "st- atus". BEISPIEL: ?batch if status < 20 then @test.com Die Batch-Datei 'test.com' soll aus diesen beiden Zeilen bestehen. Durch eine šberprfung der Anzahl laufender Batch-Files verhindert man, daá 'test.com' ein 21. Mal gestartet wird (was natrlich zu einer Fehlermeldung fhren wrde). Man erkennt an diesem Beispiel zus„tzlich, daá es mithilfe solcher Dateien m”glich ist, rekursive Funktionen aufzubauen. Durch das Limit von maximal 20 gleichzeitig offene Dateien, wird diese M”glichkeit allerdings ziemlich eingeschr„nkt! -> ?flag ---------------------- Legt in "status" den Wert des angegebenen Flags ab. Dabei steht 1 fr gesetzt und 0 fr nicht gesetzt. BEISPIEL: if $# = 1 then goto AllesKlar ; echo Aufruf: @switch.com stop ; lbl AllesKlar ?flag $0 if status = 1 then off $0 else on $0 Diese Batch-Datei namens 'switch.com' kehrt den Wert eines Flags um. -> ?stop -------- Bedingtes Stoppen einer Batch-Datei. Der Benutzer wird gefragt, ob der Batch-File angehalten werden soll (die voreingestellte Antwort ist brigens nein). -> @ [arg0 ... arg9] --------------------------- Analog zu "batch", nur diesmal mit "@". Dieses Kommando ist einfach nur fr die Liebhaber von VMS gedacht. BATCH-PROCESSING 89 BEISPIEL: @bsp.com Aufruf der Batch-Datei 'bsp.com'. -> batch [arg0...arg9] ----------------------------- Aufruf einer Batch-Datei 'file'. 'arg0' bis 'arg9' entsprechen Stri- ngs. Innerhalb eines Batch-Files k”nnen Platzhalter gesetzt werden ('$0' bis '$9'). Diese werden durch die Strings ('arg0' bis 'arg9') bei einem Abarbeiten des Batch-Files ersetzt. Dadurch wird erreicht, daá z.B. eine Batch-Datei, die die Compilierung und das Linken eines Sourcefiles zusammenfaát, fr unterschiedliche Quelltexte Verwendung finden kann. Neben dem Kommando "?arg", mit dem festgestellt werden kann, ob ein bestimmtes Argument gesetzt ist, gibt es noch '$#', daá durch die Anzahl der gesetzten Argumente ersetzt wird. Dies kann z.B. mithilfe des "let"-Befehls einer Variablen zugewiesen werden. '$0' repr„sentiert den ersten Argumentstring ('arg0'), '$1' den zwei- ten usw. bis '$9'. Diese Argumente k”nnen in beliebiger Reihenfolge in der Batch-Datei verwendet werden. Es muá vielleicht noch erw„hnt werden, daá die Verwendung eines solchen Parameters diesen nicht l”scht, d.h. daá z.B. mehrmaliges Anwenden von "echo $0" immer wieder zum selben Resultat (sprich Ausgabe) fhren wrde! Fr faule Benutzer meines Schlages gibt es die M”glichkeit, auf die Eingabe der Extension 'COM' zu verzichten, auch wenn die Batch-Datei diese besitzen sollte. Kann der Interpreter einen angegebenen Batch- File nicht finden, versucht er noch durch Anh„ngen von 'COM' zum Erfolg zu kommen. Beispielsweise wrde die Datei 'BSP.COM' durch "batch bsp" und durch "batch bsp.com" aufgerufen werden. Ich m”chte an dieser Stelle betonen, daá ein Batch-File durchaus keine Extension haben muá. Jeder gltige Filename kann fr eine Batch-Datei verwendet werden! Und noch etwas zu unser aller Bequemlichkeit, die durch "path" fest- gelegten Suchpfade werden auch beim Aufruf einer Batch-Datei abge- klappert. Zum Aufruf muá allerdings "batch" bzw. "@" angegeben wer- den! Es k”nnen maximal 20 Batch-Files zur gleichen Zeit laufen (sich gegenseitig aufrufen)! Die Argumente sind in jedem dieser zwanzig m”glichen Dateien unterschiedlich, d.h. besitzt File A die Belegung 'BEISPIEL' fr '$0' und ruft dann File B auf, so ist dort '$0' unbe- setzt, wenn beim Aufruf kein Argument explizit angegeben worden ist. Unbesetzte Argumente wurden in „lteren Programmversionen einfach berlesen, d.h. man ein unbelegtes '$3' w„re einfach nicht ersetzt worden. Ab Version vom 21.8.90 wird ein unbesetztes Argument ent- fernt! Will man einen Parameter haben, der wie ein '$'-Argument aussieht (z.B. '$0'), so muá beim Aufruf explizit ein '$0'-String angegeben werden oder das '$'-Zeichen doppelt vorkommen ('$$9' wrde also zu '$9' werden). Das mit den Argumenten m”chte ich an dieser Stelle noch an einem kleinen Beispiel zu verdeutlichen versuchen. BATCH-PROCESSING 90 Ich gehe mal davon aus, daá man sich in 'command.prg' befindet. Die folgende Eingabesequenz erzeugt nun eine Batch-Datei 'bsp.com' (unter Verwendung der Ausgabeumleitung), die nichts anderes macht, als zwei Argumente mit "echo" auszugeben. Der Benutzer kann daran leicht die Wirkung der '$'-Ersetzung durch Eingabeparameter erkennen. 81>echo >bsp.com echo $0 $1 82>batch bsp.com arg1 arg2 arg1 arg2 83> Je nachdem mit welchen Argumenten diese Datei nun aufgerufen wird, „ndert sich die Ausgabe. Man sollte sich ruhig auch mal anschauen, welche Ausgabe bei fehlender Argumentangabe kommt bzw. bei Angabe von drei oder noch mehr Parametern. Ein Aufruf der Form "batch bsp.com $0 $1" h„tte brigens die Ausgabe $0 $1 zur Folge, d.h. Parameter $0 wird durch die Zeichenfolge '$0' belegt, $1 mit '$1'. Und noch ein Beispiel zur Auflockerung: Ausgehend von folgendem Batch-File namens 'test.com' echo >>$0 $1 $2<< echo >>$2$1<< echo >>$2 $1$0<< h„tte die Eingabe 121>batch test a b c die folgende Wirkung auf dem Bildschirm >>a b c<< >>cb<< >>c ba<< Mit der Eingabe 122>batch test erh„lt man >> << >><< >> << und erkennt klar und deutlich, wie unbesetzte Argumente einfach rausgeschmissen werden. Und last-not-least falls einmal das '$'-Zeichen selbst gebraucht wird: echo $$0 $$1 BATCH-PROCESSING 91 gibt '$0 $1' aus. Ich hoffe, das Spielchen mit den '$'-Argumenten ist damit gengend verwirrend n„hergebracht worden. -> break -------- Es werden s„mtliche laufenden Batch-Files gestoppt, d.h. ruft eine Batch-Datei eine andere auf, in der dann dieser Befehl steht, werden beide Filebearbeitungen abgebrochen (im Gegensatz zu "stop"). -> cleararg ----------- (kompletter Name: clear argument) L”scht alle vorhandenen Parameterbelegungen fr '$'-Argumente. -> exist ------------------------- Es wird getestet, ob die Datei/das Verzeichnis 'file' existiert. Ist dies der Fall, wird der Befehl 'command' ausgefhrt, ansonsten beim n„chsten Befehl weitergemacht. Zus„tzlich wird das Dateiattribut in "status" abgelegt (dies geschieht natrlich nur, wenn der Eintrag existiert). BEISPIEL: exist test.prg goto paletti Existiert der File 'test.prg' wird zur Marke 'paletti' gesprungen. -> getarg --------- (kompletter Name: get extern argument) Diese Funktion liest aus einem mit "openarg" ge”ffneten File Strings und belegt die '$'-Parameter damit (diese Belegung geht analog zu "setarg" vor sich!). Eine Zeile in dieser Datei kann dabei mehrere, durch Leerzeichen getrennte Argumente enthalten. Leerzeilen werden berlesen. Pro "getarg" wird immer nur eine Zeile eingelesen und die '$'-Parame- ter damit belegt, d.h. um eine Datei komplett abzuarbeiten, mssen ggf. mehrere Zugriffe erfolgen (siehe auch das Beispiel). Das Ende der Datei wird durch ein Setzen der "status"-Variable auf 255 kenntlich gemacht. BEISPIEL: Es soll folgender Datenfile 'test.dat' vorliegen: 1 2 3 4 a b c d BATCH-PROCESSING 92 Die Batch-Datei 'test.com' sieht folgendermaáen aus: openarg test.dat ; ”ffne 'test.dat' cleararg ; ggf. '$'-Belegungen entfernen ; lbl loop ; getarg-Schleife getarg ; eine Zeile einlesen if status = 255 then stop ; alles abgeklappert -> Abbruch ; lbl loop2 ; shiftarg-Schleife echo $0 ; Argument-Ausgabe auf Screen shiftarg ; alle Argumente verschieben ?arg 0 goto loop2 ; solange noch Argumente vorhanden ; goto loop ; n„chste Zeilen einlesen Dieser File enth„lt zwei Schleifen, eine „uáere, die fr das Einlesen der Argumente aus 'test.dat' zust„ndig ist und eine innere, die diese Parameter auf den Bildschirm ausgibt. In diesem Beispiel kann man brigens recht nett die Funktionsweise einiger Batchkommandos sehen. Was nun im Einzelnen so abgeht, steht, hoffentlich verst„ndlich genug, in den Kommentaren zu den einzelnen Befehlszeilen. Ich kann eigentlich nur empfehlen, die zwei Dateien mal reinzuklop- fen/rauszukopieren und ein biáchen damit zu experimentieren, die tiefenpsychologischen Grnde hinter den einzelnen Kommandos, drften dann ziemlich schnell deutlich werden. -> gosub ---------------- (kompletter Name: go to subroutine) Sprung zur angegebenen Marke (vgl. "lbl" und "goto"). St”át der Interpreter allerdings auf ein "return"-Kommando, wird bei dem Befehl weitergemacht, der auf das "gosub" folgt. Die Anzahl von verschachtelten Unterprogrammaufrufe ist nur durch die Verfgbarkeit von freiem RAM begrenzt. Es ist m”glich, rekursive Aufrufe durchzufhren. BEISPIEL: let i 0 gosub rekursiv stop ;Unterprogramm lbl rekursiv ++ i vardump if i > 5 then goto subroutine_end gosub rekursiv lbl subroutine_end return Dieses Beispiel stellt eine Batch-Datei dar, in der der Inhalt der Variablen 'i' ausgegeben wird. Hat 'i' den Wert 6 erreicht, wird die Bearbeitung abgebrochen. Der Aufruf des Unterprogrammteils erfolgt, bis auf den ersten Aufruf, rekursiv. BATCH-PROCESSING 93 -> goto --------------- Sprung zur angegebenen Marke (vgl. "lbl"). BEISPIELE: goto sprungmarke Es wird zum Label 'sprungmarke' gegangen. Dies muá durch "lbl sprung- marke" definiert sein. lbl unendlich goto unendlich Dieser Batch-File wrde nie von allein abbrechen. Man hat es hier mit einer Ringleitung zu tun. -> ifarg -------------------------------------- (kompletter Name: if argument) Wenn 'string1' gleich 'string2' ist, wird Befehl 'command' ausge- fhrt. Dieser Befehl ist haupts„chlich fr die flexible Reaktion auf unter- schiedliche Eingabeparameter in Batch-Dateien gedacht. BEISPIEL: ifarg $0 bingo goto ist_gleich Ist der erste Eingabeparameter in einen Batch-File 'bingo', dann wird zur Marke 'ist_gleich' gesprungen. -> inquire [string] ------------------- Dieser Befehl stellt das interaktive Žquivalent zu "setarg" dar. St”át der Kommandinterpreter in einem Batch-File auf dieses Kommando, muá der Benutzer ein oder mehrere Argumente eingeben (durch Leerzei- chen getrennt). Diese werden dann wie bei "setarg" auf die '$'s ver- teilt. Die Eingabe muá durch (bzw. ) abgeschlossen werden! Mit der -Taste k”nnen Korrekturen vorgenommen werden. Die CURSOR-Tasten, u.s.w. haben bei diesem Kommando keine Wirkung, d.h. man muá auf den normalen Eingabekomfort verzichten. 'string' repr„sentiert den Text, der den Benutzer zur Eingabe auffor- dert. Diese Angabe ist optional. L„át man sie allerdings weg, muá der Benutzer selber drauf kommen, daá eine Eingabe von ihm erwartet wird. Es k”nnen brigens die gleichen Ausgabeanweisungen wie bei "echo" benutzt werden. Man muá keine Eingabe vornehmen (auáer natrlich). Ein einfaches Drcken dieser Taste erzeugt allerdings auch kein Argument. Fhrende Leerzeichen werden brigens ignoriert, d.h. werden nur Leerzeichen eingegeben und dann gedrckt, entspricht dies einem einfachen Bet„tigen der /-Taste ohne weitere Zeichen und erzeugt kein Argument. BATCH-PROCESSING 94 Mit "inkey" gibt es noch einen weiteren Befehl, der Benutzereingaben zul„át, die in einem Batch-File verarbeitet werden k”nnen. Da dies mithilfe von Variablen geschieht, findet sich die Beschreibung im Variablenkapitel. BEISPIELE: ?arg 0 goto gibt_argument inquire Argument: restart lbl gibt_argument echo $0 Diese Zeilen sollen einen Beispielbatchfile darstellen. Wird dieser mit einem Argument aufgerufen erfolgt ein direkter Sprung zur Marke 'gibt_argument', ansonsten wird der Benutzer aufgefordert, ein Argu- ment einzugeben. Durch "restart" wird zum Dateianfang gesprungen, wo berprft wird, ob der Benutzer ein Argument eingegeben hat oder nicht. Das ganze l„uft also zyklisch ab, wenn immer nur bzw. gedrckt wird (ohne weitere Zeichen). Das folgende Beispiel ist etwas komplizierter. Man h„tte es brigens durch Verwendung von "while" um einiges netter machen k”nnen. inquire Argumente: goto loop_start lbl loop echo $0 shiftarg lbl loop_start ?arg 0 goto loop Dieses Beispiel repr„sentiert eine Batch-Datei, die nacheinander alle vom Benutzer eingegebenen Argumente ausgibt. Angenommen diese Datei wrde 'test.com' heiáen, so k”nnte z.B. folgender Ablauf entstehen: 79>@test Argumente:Arg1 Arg2 Arg3 Arg1 Arg2 Arg3 80> d.h. der Benutzer macht die Eingabe "Arg1 Arg2 Arg3". Diese wird dann vom Interpreter auf drei '$'-Argumente ('$0' - '$2') aufgeteilt. -> lbl -------------- (kompletter Name: label) Einfhrung einer Sprungmarke in einem Batch-File. Diese Marken k”nnen mit "goto" und "gosub" angesprungen werden. In einer "lbl"-Zeile drfen sonst keine Befehle stehen! Also w„re z.B. lbl beispiel echo dies ist ein Beispiel BATCH-PROCESSING 95 nicht erlaubt (es kommen zwei Kommandos, "lbl" und "echo", vor). lbl ein_gueltiges_label Diese Marke entspricht dem zul„ssigen Format. Es gilt brigens als L„ngenbegrenzung fr einen Sprungmarken-Ausdruck nur die Zeile. -> left ------------------------------------- Wenn der Startteil von 'string1' mit 'string2' bereinstimmt, wird 'command' ausgefhrt. BEISPIELE: left abcdef abc goto stimmt_berein Da 'abc' in 'abcdef' vorkommt, wird hier zur Marke 'stimmt_berein' gesprungen. left passt_nicht zusammen goto stimmt_berein Hier passiert nichts, da 'passt_nicht' und 'zusammen' nun mal gar nicht so recht bereinstimmen. Noch eine kleine Randbemerkung, die Anzahl der Argumente wird, aus Platzgrnden, nicht so besonders intensiv untersucht. Verwendet man "left" (bzw. "right") in Verbindung mit '$'-Argumenten, muá man selber dafr Sorge tragen, daá die Parameteranzahl stimmt. ?arg 0 ?arg 1 left $0 $1 goto alles_klar Wie man das fr zwei $-Parameter machen kann, zeigt dieses Beispiel. -> oldy --------------------------------- Wenn das Erstellungsdatum (damit ist Uhrzeit und Tag gemeint) von 'fileA' vor dem von 'fileB' liegt, wird der Befehl 'command' ausge- fhrt. Dies geschieht auch, wenn das Datum der beiden Dateien gleich ist. Mit diesem Befehl ist es z.B. m”glich, eigene (mini)-MAKE-Umgebungen zu erstellen. BEISPIEL: oldy command.o command.c cc command.c Ist Datei 'command.o' „lteren Datums als 'command.c', dann fhre Kommando 'cc command.c' aus (was hier sinnvollerweise einer Compilie- rung von 'command.c' entsprechen soll). -> openarg ----------------- (kompletter Name: open argument-file) Wie bereits bei "getarg" angesprochen, existiert die M”glichkeit, ber einen Datenfile eine Belegung der '$'-Argumente durchzufhren. Diese Datei wird mit "openarg" ge”ffnet und mit dem Kommando "getarg" BATCH-PROCESSING 96 ausgelesen. Es kann immer nur ein File offen sein, eine wiederholte Anwendung fhrt immer zu einem Schlieáen der ersten Datei und zu einem ™ffnen der zweiten! Der Datenfile muá nicht explizit geschlossen werden (es gibt dafr auch kein Kommando). -> repeat --------- until [not] <'<>'|'='|'>'|'<'|'>='|'<='> ----------------------------------------------------------------- Diese beiden Kommandos bilden, neben "while" ... "wend", ein m”gli- ches Schleifenkonstrukt. Im Gegensatz zur WHILE-Schleife wird hier erst am Schleifenende, also bei "until", abgeprft, ob ein weiterer Durchgang erfolgen soll. Dies ist immer dann der Fall, wenn der logische Ausdruck falsch ist (ein weiterer Unterschied zu "while"). Da das Kriterium zum Abbruch einer Schleife erst am Ende abgeprft wird, erfolgt immer mindestens ein Durchgang durch die Kommandos, die die Schleife beinhaltet! Mithilfe von "not" kann man das Ergebnis des logischen Ausdrucks umgekehren. Es ist m”glich, verschachtelte "repeat".."until"-Schleifen aufzubau- en. Die Anzahl gleichzeitig offener Schleifen h„ngt nur vom frei verfgbaren Speicher ab. Ein Wort zur Warnung; man sollte es tunlichst vermeiden, aus solchen Schleifen rauszuspringen (Ausnahme: Beenden der Dateiabarbeitung, dann werden n„mlich alle internen Verweise auf solche Schleifen wieder entfernt). Damit kann man den Interpreter hbsch durcheinander bringen. Auch das Abschalten des Abbruchs einer Batchbearbeitung durch Rcksetzen des 'errorbreak'-Flags ("off 2") ist unter Umst„nden eine ausgezeichnete Methode, die ganze Sache ein biáchen aufzumi- schen. BEISPIELE: let i 0 ; echo Schleifenanfang ; repeat print i ++ i until i > 9 ; echo Schleifenende Diese Schleife wird solange ausgefhrt bis die Variable 'i', die am Anfang der Batch-Datei auf Null gesetzt wird, den Wert 10 erreicht hat. In jedem Schleifendurchgang wird der Inhalt der Variablen ausgegeben und diese anschlieáend hochgez„hlt. BATCH-PROCESSING 97 let i 0 ; while i < 10 ++ i print i let j 10 ; repeat print j -- j until j = 0 ; wend ; Hier haben wir es mit einer WHILE-Schleife zu tun, die eine REPEAT- Schleife enth„lt. Das WHILE-Konstrukt z„hlt den Paramter 'i' hoch, setzt den Parameter 'j' auf zehn und ruft dann die REPEAT-Schleife auf, die 'j' wieder auf Null runterz„hlt. -> restart ---------- Befehl innerhalb einer Batch-Datei zum Neustart der Datei, d.h. Sprung zur ersten Befehlszeile und dort weitermachen. -> return --------- Rcksprung aus einem Unterprogramm (vgl. auch "gosub"). -> right -------------------------------------- Verh„lt sich analog zu "left", nur daá diesmal das Ende von 'string1' mit 'string2' bereinstimmen muá, damit 'command' ausgefhrt wird. BEISPIEL: right xyzabc abc goto ende_stimmt Da 'xyzabc' als letzte drei Zeichen 'abc' hat, wird zur Marke 'ende_stimmt' gesprungen. -> setarg ----------------------- (kompletter Name: set argument) Mit diesem Kommando lassen sich, mal wieder, '$'-Parameter belegen. Dabei wird immer der erste freie Parameter belegt. bersteigt die Anzahl dabei zehn Parameter, werden die berz„hligen Argumente igno- riert. W„re '$0' bereits mit String XYZ belegt (z.B. durch eine Parameter- angabe beim Aufruf des Batch-Files), wrde der Befehl "setarg abc" '$1' mit dem String 'abc' belegen. BATCH-PROCESSING 98 BEISPIEL: cleararg setarg a b c d e lbl loop echo $0 shiftarg ?arg 0 loop stop Bei diesem Beispiel handelt es sich um eine Batch-Datei, die nach- einander die Buchstaben 'a' - 'e' ausgibt. "?arg" wird dabei als Abbruchkriterium verwendet, d.h. solange '$0' noch belegt ist, wird eine Ausgabe vorgenommen. Mit "repeat".."until" k”nnte das ganze so aussehen: cleararg setarg a b c d e repeat echo $0 shiftarg until $# = 0 Der Vorteil liegt in einer etwas h”heren Bearbeitungsgeschwindigkeit. -> shiftarg ----------- (kompletter Name: shift argument) Verschiebt existierende Argumente um eine Position nach links. Das erste Element f„llt dabei heraus. Existieren keine Elemente, hat dieses Kommando keine Funktion (es erfolgt keine Fehlermeldung)! Gibt es z.B. die drei Argumente ARG1, ARG2 und ARG3, dann w„re ARG1 '$0' zugeordnet, ARG2 '$1' und ARG3 '$2'. "shiftarg" wrde nun ARG1 l”schen und die beiden verbleibenden Argumente um eins nach links schieben, d.h. ARG2 w„re nun '$0' zugeordnet und ARG3 '$1'. '$2' ist nicht mehr belegt. Mit diesem Befehl kann in Batch-Dateien auf eine variable Anzahl von Eingabeparametern eingegangen werden bzw. die Erstellung von Schlei- fen ist flexibler gestaltbar. -> size0 ------------------------- Existiert die Datei 'file' nicht oder ist ihre Gr”áe Null, wird der angegebene Befehl 'command' ausgefhrt, ansonsten auch wieder beim Folgebefehl weitergemacht (die umgekehrte Funktion von "exist"). BEISPIELE: size0 datei.dat goto ist_nicht_da Kann die Datei 'datei.dat' nicht gefunden werden, wird zu Label 'ist_nicht_da' gesprungen. size0 mmcc.ttp cp d:\mmcc.ttp *.* BATCH-PROCESSING 99 Existiert die Datei 'mmcc.ttp' nicht im aktuellen Verzeichnis, wird sie von Laufwerk D rberkopiert. Die Kommandos "size0" und "exist" sind ganz praktisch, wenn es um die Compilierung/Assemblierung und Linkung von Sourcefiles geht. Es gibt z.B. Compiler, die auf das Fehlen eines Sourcefiles mit einem Bomben- hagel reagieren. Dieses Problem kann mit diesen Befehlen umgangen werden. -> status [-s] -------------- Ausgabe einer Variablen, die zur Steuerung innerhalb eines Batch- Files benutzt werden kann. Sie wird vor jedem Ablauf einer Batch- Datei auf Null gesetzt. Werden innerhalb des Files andere Programme (z.B. Compiler) gestar- tet, so wird deren Rckgabewert in "status" abgelegt. Ein fehlerhaf- ter Compilerlauf kann also zum Sprung zu einer bestimmten Marke oder zum Ausstieg aus dem Batch-File fhren. Der Benutzer muá allerdings die Rckgabewerte der Programme und ihre Bedeutung kennen. Es kommt diesem Systemparameter aber noch eine andere Bedeutung zu. Jede Fehlermeldung des Interpreters hat in einer Fehlernummer, die diese Variable dann enth„lt, ihren Niederschlag. Damit lassen sich in Batch-Dateien bestimmte Reaktionen auf eventuell aufgetretene Fehler einbauen (in BASIC wrde man wohl von ON ERROR GOTO sprechen). "status" kann unter Verwendung des "let"-Kommandos aus der Variablen- abteilung auf bestimmte Werte gesetzt, bzw. anderen Variablen zugewiesen werden. Es gibt inzwischen eine Anzahl von Befehlen, die "status" mit Werten belegen (z.B. "exist"). In Verbindung mit den Schleifen-Konstrukten oder "if" ... "then" aus der Variablenabteilung lassen sich damit vom Benutzer bestimmte Abl„ufe in Abh„ngigkeit von den jeweiligen Werten einrichten. Es ist allerdings zu beachten, daá diese Variable ihren Inhalt unter Umst„nden ziemlich schnell ver„ndert (z.B. beim Aufruf anderer Programme, aber auch bei einigen internen Kommandos)! Man sollte ihn also, falls man ihn zu einem sp„teren Zeitpunkt noch ben”tigt, sicherheitshalber immer erst in eine andere Variable ret- ten, ehe man weitere Kommandos ausfhrt! Ein Beispiel dazu findet sich beim "findnext"-Befehl. Wird nur der Befehl "status" eingegeben, erfolgt die Ausgabe des Variablenwertes. Damit lassen sich also Rckgabewerte bestimmen. "status" ist ein Longinteger (32-Bit). Option | Bedeutung -------+------------------------------------------------------------ s | Unterdrckt die Ausgabe von '->status'. | -> stop ------- Stoppen eines Batch-Files. BATCH-PROCESSING 100 -> wait [-s] [seconds] ---------------------- Warten auf das Drcken einer Taste / den Ablauf der angegebenen Sekunden. Die Abarbeitung eines Batch-Files wird solange angehalten, bis eine Taste gedrckt wird oder die Anzahl der Sekunden erreicht ist (hierbei handelt es sich um ein ausschlieáendes 'oder'), d.h. wird an dieser Stelle gedrckt, erfolgt ein Abbruch der Batchbearbeitung, wenn keine Sekunden angegeben waren. Im anderen Fall, wird nur die Warterei auf den Zeitablauf unterbrochen und beim n„chsten Befehl weitergemacht. Dieses Kommando kann z.B. dazu verwendet werden, die Abarbeitung eines Batch-Files solange anzuhalten bis ein ausgegebener Text gele- sen worden ist. Option | Bedeutung -------+------------------------------------------------------------ s | Unterdrckt die Bildschirmausgabe. | BEISPIELE: wait Es wird auf das Drcken einer Taste gewartet. wait 10 Es wird zehn Sekunden lang gewartet. Nur das Drcken von hat hier eine Wirkung, andere Tasten werden ignoriert! Die Sekunden mssen nicht unbedingt explizit als Zahl angegeben werden, die Verwendung von Parametern ist auch zul„ssig: let sekunden 5 wait sekunden w„re eine erlaubte Befehlsfolge. Sekundenangaben <= 0 fhren brigens zu einer Fehlermeldung! -> wend ------- Endemarkierung einer WHILE-Schleife (vgl. "while"-Kommando). -> wexit -------- Abbruch einer WHILE-Schleife. Es wird bei dem Befehl weitergemacht, der auf das "wend"-Kommando folgt. BATCH-PROCESSING 101 BEISPIEL: while 1 = 1 wexit echo hier kommt man nie hin wend echo erstes Kommando nach Schleife Eigentlich wrde diese Schleife nie abgebrochen werden. Durch Verwendung von "wexit" wird die Beendigung der Schleife allerdings erzwungen. -> while [not] <'<>'|'='|'>'|'<'|'>='|'<='> ----------------------------------------------------------------- while ?arg <'0' | ... | '9'> ------------------------------- Dieses Kommando wird zum Aufbau von WHILE-Schleifen benutzt. Das Ende einer solchen Schleife wird durch "wend" markiert. Ein Schleifendurchgang erfolgt, wenn der Ausdruck nach "while" wahr ist, andernfalls wird in der Zeile nach dem "wend"-Kommando weiterge- macht. Es ist m”glich, verschachtelte Schleifen aufzubauen. Man muá aller- dings beachten, daá jedes gefundene "wend" dem jeweils letzten gltigen "while"-Befehl zugeordnet wird. Man kann also durch unvor- sichtiges Springen in einer Batch-Datei ein kleines Durcheinander anstellen! "not" kehrt das Ergebis des logischen Ausdrucks um. Die '?arg'-Schleife wird durchlaufen, wenn das nachfolgend angegebene '$'-Argument existiert. BEISPIELE: let i 0 echo Schleifenstart while i < 10 print i ++ i wend echo erster Befehl nach Schleife Dieser Beispiel-Batch-File durchl„uft die Schleife solange, bis die Variable 'i' den Wert 10 hat. let a 0 while a <> 5 let b 0 while b <> 2 vardump ++ b wend vardump ++ a wend Dieses Beispiel zeigt einen verschachtelten Batch-File, der aus zwei Schleifen besteht. Die innere wird immer zweimal durchlaufen, w„hrend BATCH-PROCESSING 102 die „uáere genau fnfmal durchlaufen wird. "vardump" listet die existierenden Variablen und ihre zugeordneten Werte auf. Um das ganze besser zu erkennen, habe ich die ganze Chose entsprech- end eingerckt. setarg A B C ; echo Starte Schleife:%n while ?arg 0 echo $0 ;Ausgabe $0 shiftarg wend ; echo %nSchleife wurde verlassen Das letzte Beispiel zeigt die Verwendung von "while" in Verbindung mit '$'-Argumenten. Die Schleife wird solange durchlaufen, bis kein Argument mehr vorhanden ist. Dabei wird bei jedem Durchgang '$0' ausgegeben. iii) Beispiele -------------- Bsp.1 ; ; Batch-File zur Compilierung und zum Linken eines C-Files ; durch den MEGAMAX-C-Compiler ; mmcc.ttp $0.c ;Aufruf des Compilers if status <> 0 then stop ;Abbruch, wenn Fehler aufgetreten ist mmlink.ttp $0.o -O $1 ;Aufruf des Linkers if status <> 0 then stop ;Abbruch im Fehlerfall rm $0.o ;L”schen des Objektfiles Das vorliegende Beispiel kann direkt zur Arbeit mit dem MEGAMAX-C- Compiler (nicht LASER-C !) herangezogen werden (ggf. muá man natr- lich noch Pfadnamen fr das Compiler- und Linkerprogramm anfgen). Die ersten vier Zeilen dienen lediglich der Kommentierung der Batch- Datei. In Zeile fnf wird der Compiler aufgerufen. '$0' repr„sentiert den Namen des Sourcefiles (Eingabe ohne Extension!). Der Compiler gibt bei einem erfolgreichen Durchlauf eine Null zurck. Andernfalls sorgt Zeile sechs fr einen Abbruch der Batchbearbeitung. Nach der Compilierung soll der Objektfile gelinkt werden. Dies geschieht in Zeile sieben. Sollten dort Probleme aufgetreten sein, erfolgt in Zeile acht ein Abbruch. In Zeile neun wird der aufgetretene Objektfile wieder gel”scht. In Zeile sieben wird brigens ein zweites Argument benutzt. Dieses gibt den Namen des lauff„higen Programms an (diesmal mit Extension). Ein Aufruf dieser Batch-Datei k”nnte nun folgendermaáen aussehen: batch cc command command.prg BATCH-PROCESSING 103 „quivalent dazu w„re der Aufruf: @cc command command.prg Es wird also der C-File 'command.c' compiliert und gelinkt. Der daraus resultierende File soll 'command.prg' heiáen. Der zwischen- zeitlich entstehende File 'command.o' wird durch den "rm"-Befehl gel”scht. Die eigentliche Batch-Datei heiát 'cc'. Die Parameterangaben '$0' und '$1' werden durch die Argumente 'command' (= '$0') und 'command.prg' (= '$1') ersetzt. Das zweite Beispiel dient dem gleichen Zweck, nur soll diesmal im Falle eines Fehlers ein Editor ('editor.prg' genannt) aufgerufen und nach erfolgter Edierung wieder zum Anfang der Batch-Datei gesprungen werden: Bsp.2 ; ; Batch-File zur Compilierung und zum Linken eines C-Files ; durch den MEGAMAX-C-Compiler ; mmcc.ttp $0.c ;Aufruf des Compilers if status <> 0 then goto edit ;Sprung zum Editor, wenn Fehler mmlink.ttp $0.o -O $1 ;Aufruf des Linkers if status <> 0 then goto edit ;Sprung zum Editor,wenn Fehler rm $0.o ;L”schen des Objektfiles stop ;Stoppen des Batch-Files lbl edit ;Label 'edit' wait ;in aller Ruhe Fehlermeldungen lesen editor.prg $0.c ;Editoraufruf restart ;Neustart des Batch-Files Die Interpretierung dieses Files drfte nach den vorhergehenden Ausfhrungen und der beigefgten Kommentierung, keine Probleme mehr bereiten. BATCH-PROCESSING 104 Bsp.3 ; ; Batch-Datei zur Assemblierung von Sourcefiles ; mit dem Assembler aus dem Entwicklungspaket von DRI ; off 13 ; kein Geschwafel cls size0 $0.s goto fehler ; Sourcefile muá schon dasein echo 1. Assemblierung ; erster Schritt as68.ttp -l -u $0.s size0 $0.o goto fehler ; Ergebnis der Assemblierung echo 2. Linken ; zweiter Schritt echo $0.s ==> $0.$1 link68.ttp [u] $0.68k = $0.o ; Linken des 'o'-Files size0 $0.68k goto fehler ; wenn kein Ergebnis -> Fehler echo 3. Relativlader relmod.ttp $0.68k $0.$1 ; Ergebnis basteln rm $0.68k $0.o ; berflssige Files l”schen echo stop lbl fehler ; Fehler melden echo !!! Abbruch wegen Fehler !!! echo Mit diesem File kann die Assemblierung von Dateien durch den Assemb- ler des Entwicklungspakets automatisiert werden. Diese Datei ben”tigt zwei Argumente, zum einen den Namen des Sourcefiles (ohne 'S'-Exten- sion) und zum anderen die Extension der Zieldatei, also 'PRG', 'TOS', 'ACC' , 'APP' oder 'TTP'. Will man z.B. den File 'test.s' assemblieren, k”nnte der Aufruf folgendermaáen aussehen: @as test prg Es wird dabei angenommen, daá die Batch-Datei 'as' heiát. Der Ergeb- nisfile wrde hier 'test.prg' heiáen. iv) 'command.prg' im AUTO-Ordner -------------------------------- Auf den Gag bin ich natrlich auch wieder nicht selbst gekommen (war wahrscheinlich zu naheliegend). Die Idee, bzw. das Problem kam aus Mnchen, 'command.prg' im AUTO-Ordner zum Konfigurieren einer RAM- Disk (oder was auch immer sonst) zu verwenden. Ich habe das dann ausprobiert, und siehe, es tat (unter TOS 1.4). Man muá allerdings beachten, daá 'auto.com' nicht auch im AUTO-Ordner, sondern im Wurzelverzeichnis stehen muá, d.h. wird von Laufwerk C gebootet, so steht 'command.prg' im Verzeichnis 'C:\AUTO', 'auto.com' in 'C:\' (das gilt auch fr 'alias.dat' und 'command.hlp'). M”chte man irgendwelches Zeug auf eine RAM-Disk kopieren, w„re es natrlich ganz geschickt, wenn die Installation derselben vor dem Aufruf von 'command.prg' erfolgen wrde! Eine andere vorstellbare Anwendung w„re das selektive Žndern von Accessory-Extensions. Man kann auf diese Weise dann immer die Acces- BATCH-PROCESSING 105 sories raussuchen, die gestartet werden sollen. Das folgende Beispiel zeigt eine solche Batch-Datei: ~off 13 off 6 let von$ ACC let nach$ ACX ; chr 'a' Taste_a chr 'j' Taste_j chr 'n' Taste_n ; gosub suchdatei let von$ ACX let nach$ ACC echo gosub suchdatei exit ; ; lbl suchdatei let i 0 findfirst acc$ *.Ývon$ if status = -1 then return echo %nÝvon$ --> Ýnach$ echo -----------%n repeat let$ dateiÝi.$ acc$ ++ i findnext acc$ until status = -1 ; while i > 0 -- i let$ acc2$ dateiÝi.$ let$ acc$ acc2$ rightcut 3 acc2$ echo %l%1Ýacc$ -> Ýacc2$Ýnach$ (abbruch/a/ein/)%1 let Loop 1 repeat inkey taste &= taste 255 case taste of 13 ; '' echo wexit of Taste_a ; 'a' echo exit of Taste_j ; 'j' echo ja mv Ýacc$ Ýacc2$Ýnach$ let loop 0 of Taste_n ; 'n' echo nein let loop 0 BATCH-PROCESSING 106 endcase until loop = 0 wend ; return Dieses Beispiel mag ohne die Ausfhrungen aus der Variablen-Abteilung etwas kryptisch erscheinen. Man sollte sich deshalb vielleicht erstmal mit dem folgenden Abschnitt befassen und dann an diese Stelle zurckkehren. Ich m”chte ausdrcklich auf folgende Einschr„nkung hinweisen, die ich in der ATARI-Beschreibung zum Rechner gefunden habe und die leider richtig ist: "Im AUTO-Ordner k”nnen keine Programme gestartet werden, die die Maus, Fenster, Mens oder Dialogboxen benutzen." Also, so richtig loslegen vom AUTO-Ordner aus ist nicht. VARIABLEN 107 VII. Variablen ============== Der Benutzer ist in der Lage, Variablen zu definieren und kann mit diesen einfache Rechnungen durchfhren, Schleifen aufbauen oder durch Sprunganweisungen bestimmte Abl„ufe innerhalb von Batch-Dateien erzeugen. Man sieht vielleicht hier schon, daá die Variablen in der Hauptsache zum einfacheren Arbeiten mit Batch-Dateien beitragen sollen. Die meisten der hier aufgefhrten Kommandos sind nur in solchen Dateien sinnvoll! Neben Variablen, die Zahlwerte besitzen, gibt es noch String- Variable. Bevor jetzt die Beschreibung der einzelnen Befehle kommt, erst noch ein biáchen Gequatsche bezglich 'Ý' (fr Leute, die hier ein seltsames bzw. ein Leerzeichen stehen haben, es ist das Paragra- phenzeichen gemeint). Kommt in einer Batch-File-Zeile eine solche Zeichenfolge vor, wird sie durch den Variablenwert ersetzt. Beim "let"-Kommando findet sich ein Beispiel. Man kann diese Ersetzung brigens durch "on / off 18" an-/ausschalten. '$'-Argumente werden brigens vor 'Ý' ersetzt, d.h. man kann die '$'s auch mit 'Ý' benutzen. Die Befehle im einzelnen ('|' bedeutet "entweder oder"): -> &= -------------------------- Logische UND-Verknpfung einer Variablen mit einer anderen oder einer Zahl. Das ganze entspricht in einer h”heren Programmiersprache varA := varA AND varB bzw. varA := varA AND -> *= -------------------------- Multiplikation einer Variablen mit einer anderen oder einer Zahl. -> ++ ------------------- Erh”hen von Variablen um den Wert eins. -> += -------------------------- Addition einer Variablen mit einer anderen oder einer Zahl. VARIABLEN 108 -> -- ------------------- Dekrementieren einer oder mehrerer Parameter um eins. -> -= -------------------------- Erniedrigen von 'varA' um 'varB' oder 'zahl' oder anders ausgedrckt: varA := varA - varB varA := varA - zahl 'varB' kann brigens die gleiche Variable wie 'varA' sein. In diesem Falle wrde das bedeuten, daá 'varA' nach der Operation den Wert Null hat. BEISPIELE: -= index 12 Von der Variablen 'index' wird 12 abgezogen. -= index juhu Von der Variablen 'index' wird der Wert des Parameters 'juhu' abgezogen. -> /= -------------------------- Analog zu "-=", nur daá diesmal eine Division stattfindet. -> +string ---------------------------------------- Anh„ngen von 'string' an den Inhalt der Stringvariablen. Unter Verwendung des Paragraphenzeichens in Batch-Dateien ist es m”glich, den Inhalt zweier Stringvariablen miteinander zu verknpfen. Mithilfe einer Endlosschleife kann man den Rechner nach einer Weile brigens zum Bombenlegen bringen, d.h. es findet keine Kontrolle der Stringl„nge statt! BEISPIEL: let a$ abc +string a$ def Das Ergebnis w„re der String 'abcdef'. let a$ abc +string a$ " def ghi jkl" Man erh„lt hier 'abc def ghi jkl'. -> 2* ------------------- Verdoppeln von Variablenwerten. VARIABLEN 109 -> 2/ ------------------- Halbieren von Variablenwerten. Da die Variablen vom Typ Long-Integer (32-Bit) sind, werden ungerade Variablen natrlich nicht den korrekten Wert erhalten, 11 / 2 wrde im Wert 5 resultieren und nicht in 5.5! BEISPIEL: 2/ index Hat 'index' vor Ausfhrung des Kommandos 222 enthalten, steht danach 111 in der Variablen. -> ^= -------------------------- Fhrt eine 'Entweder-Oder'-Verknpfung durch. -> case --------------------- of ----------------------------- endcase ---------- Diese drei Kommandos bilden zusammen ein Konstrukt, wie es in „hnli- cher Form in vielen Programmiersprachen vorkommt (z.B. 'switch..case' in C oder 'case..of' in PASCAL). Eine Integer-Variable bzw. eine Integer-Zahl wird mit anderen Parametern/Werten verglichen. Mit String-Variablen funktioniert das ganze nicht (es erfolgt allerdings keine besonders intensive Fehlersuche)! Bei Gleichheit werden die dem passenden "of"-Befehl folgenden Kommandos ausgefhrt. Der Startwert wird mit dem "case"-Kommando eingefhrt. Eine Reihe von "of"-Anweisungen beinhalten die Vergleichswerte, "endcase" stellt den Abschluá dieser Befehlsfolge dar. "of" l„át dabei eine ganze Liste von Werten zu. Nach diesem Kommando mssen die Befehle folgen, die bei einer šbereinstimmung ausgefhrt werden sollen. Diese Befehlsfolge gilt dann bis ein neuer "of"-Befehl oder die "endcase"-Anweisung auftaucht. Auf "case" drfen nur Leerzeilen, Kommentare, ein "of"-Kommando oder ein "endcase"-Befehl direkt folgen! "of" und "endcase" drfen nicht durch irgendwelche Alias-Ausdrcke ersetzt werden. Das gilt auch fr "case", wenn man verschachtelte "case"-Ausdrcke aufbauen m”chte. Diese Befehlsfolge l„át sich nur in Batch-Dateien anwenden. Im Direktmodus wird eine Fehlermeldung ausgegeben! Im Unterschied zu "while" und "repeat" findet bei diesem Befehl keine šberprfung statt, in welcher Batch-Datei mit ihm begonnen wurde, d.h. es ist m”glich "case" in einer anderen Datei zu haben als "endcase". Analog dazu verh„lt sich der "of"-Teil. Noch eine kleine Notiz am Rande, nicht existierende Parameter werden angelegt und auf den Wert Null gesetzt. Die folgenden Beispiele sind mehr oder weniger auch zum deutlich VARIABLEN 110 machen der anderen Konstrukte ("while" und "repeat") gedacht. Man sollte von diesen also schon mal etwas geh”rt haben. BEISPIELE: let i 0 repeat case i ; Casestart („uáeres 'case'-Konstrukt) of 0 2 4 8 echo %tIn oberem 'of'-Teil (Ýi) case i ; (inneres 'case'-Konstrukt) of 4 echo jetzt ist i:Ýi of 8 echo jetzt ist i:Ýi endcase of 1 3 5 7 echo %tIn unterem 'of'-Teil (Ýi) endcase ++ i until i = 9 Diese Batch-Datei enth„lt ein 'case'-Konstrukt in einem 'case'-Kon- strukt. Diese werden durch den Wert des Parameters 'i' gesteuert. Der obere Teil wird durchlaufen wenn 'i' einen der Werte 0, 2, 4 oder 8 hat, der untere Teil bei 1, 3, 5 oder 7. Der untere Teil besteht nur aus einer "echo"-Anweisung, der obere aus einer "echo"-Anweisung und einer zweiten "case"-Befehlsfolge. Die darin enthaltenen Anweisungen (wieder jeweils ein "echo"-Befehl) werden ausgefhrt, wenn i einen der Werte 4 oder 8 annimmt. Um die unterschiedlichen Wirkungen des Parameters zu zeigen, wird dieser innerhalb einer "repeat".."until"-Schleife ver„ndert. case x of 1 of 2 echo nie, wenn x = 1 echo aber immer, wenn x = 2 of 3 echo immer, wenn x = 3 endcase Hier erfolgt die Steuerung durch die Variable 'x'. Dieses Beispiel soll verdeutlichen, daá eine "of"-Anweisung als Grenze fr ein vohergehendes "of" zu verstehen ist. Nimmt 'x' den Wert 1 an, so wird keiner der beiden "echo"-Befehle ausgefhrt, da nach "of 1" sofort das n„chste "of" folgt. VARIABLEN 111 In die gleiche Richtung zielt das n„chste Beispiel: case a of 0 gosub a_out ++ a of 1 gosub a_out ++ a of 2 gosub a_out endcase stop ; lbl a_out echo a hat Wert Ýa return Obwohl 'a' innerhalb der "of"-Anweisungsfolge hochgez„hlt wird und damit eigentlich die n„chste "of"-Bedingung erfllen wrde, wird nicht bei diesem Folge-"of" weitergemacht, sondern die "endcase"- Anweisung gesucht und nachfolgend mit der Batchbearbeitung weiterge- macht. Es ist also maximal ein "of" gltig! ?arg 0 goto los_gehts stop lbl los_gehts case $0 of var1 ... of var2 ... of var3 ... endcase Dieses (unvollst„ndige) Beispiel soll die M”glichkeiten zeigen, die durch die Verwendung von '$'-Argumenten entstehen. Es ist dadurch leicht m”glich, einen komplexen Batch-File in verschiedene Teilberei- che zu unterteilen. Der Test, ob die Datei berhaupt mit einem '$'- Parameter versorgt worden ist, unterbindet ggf. eine Fehlermeldung bei der "case"-Anweisung. Ein anderes Beispiel, daá sich mit der passenden Anzahl von '$'- Argumenten befaát: case $# of 0 echo Argument fehlt of 1 echo $0 of 2 echo $0 $1 endcase if $# > 2 then echo zuviele Argumente! Hier wird abgeprft, ob die Zahl der angegebenen Argumente eins oder VARIABLEN 112 zwei betr„gt. Andernfalls wird eine Fehlermeldung angezeigt. let i 0 ; Variablenindex findfirst datei$ *.c ; nur C-Dateien let Attribut status ; 'status' gleich retten ; ; Alle passenden C-Dateien merken: ; while Attribut <> -1 ; 'case' steht hier fr einen ODER-Vergleich case Attribut of 0 2 32 34 ; in Frage kommende Attribute let$ dateiÝi#$ datei$ ; Datei merken ++ i ; Variablenindex erh”hen endcase ; findnext datei$ let Attribut status wend ; chr 'j' ja chr 'n' nein ; while i <> 0 -- i let$ datei$ dateiÝi#$ echo read_only bei Datei %033p Ýdatei$ %033q (j/n) %l ; while 1 = 1 ; 'ewige' Schleife inkey taste &= taste 255 ; Scancode und Schrott ausblenden |= taste 32 ; Kleinbuchstabe if taste = ja then wexit if taste = nein then wexit wend ; case taste of ja echo Ja save Ýdatei$ of nein echo Nein endcase wend Diese Batch-Datei bestimmt alle vorhandenen 'C'-Dateien im aktuellen Verzeichnis und m”chte im Anschluá daran vom Benutzer wissen, welche davon mit dem 'read-only-Attribut belegt werden sollen. Man sollte dieses kleine Beispiel vielleicht aus der Anleitung rauskopieren oder abtippen und mit "vardump" mal anschauen, welche Variablen sich so angesammelt haben (natrlich nur, wenn man Dateien mit der Extension 'C' hat, sonst muá man halt irgend etwas anderes nehmen oder ein paar Files mit dieser Erweiterung erzeugen). Das '#'-Zeichen wird brigens ben”tigt, um dem Interpreter zu ver- deutlichen, daá 'Ýi' gemeint ist und nicht 'Ýi$'. Dieses Zeichen bildet dann einen gltigen Teiles des Variablennamens (beispielsweise VARIABLEN 113 'datei0#$')! -> chr '' -------------------------- (kompletter Name: character) šbergibt an 'var' den ASCII-Codes des anzugebenden Zeichens. Eine m”gliche Anwendung findet sich bei den Beispielen zum "case"- Befehl. BEISPIEL: chr '@' zeichen Variable 'zeichen' hat jetzt den Wert 64. Dies entspricht dem ASCII- Code fr '@'. -> clear -------- Alle Variablenwerte werden auf Null gesetzt. Stringvariablen „ndern ihren Inhalt nicht. -> endcase ---------- vgl. "case"-Befehl -> erase -------- Die Variablenliste wird gel”scht. -> findfirst ---------------------------------------- Dieses Kommando erlaubt in Verbindung mit "findnext" dem Benutzer einer Stringvariablen Ordnereintr„ge zuzuweisen. Wird ein Eintrag auf den der Deskriptor paát, gefunden, erfolgt eine Zuweisung an die angegebene Variable. In "status" befindet sich das Attribut oder, wenn nichts gefunden wurde, -1. Ein eventuell dem Deskriptor mitgegebener Pfad wird brigens der Variablen nicht zugewiesen (nur der nackte Name des Eintrags)! Das gilt auch fr das Kommando "findnext". -> findnext ------------------------ Um nach dem Aufruf von "findfirst" weitere Eintr„ge zu finden, muá der Befehl "findnext" benutzt werden. Hier wird als Argument nur eine Stringvariable gefordert. Fr "status" gilt das gleiche wie bereits bei "findfirst" gesagt! Es muá beachtet werden, daá "findfirst" zur Initialisierung dieses Kommandos verwendet werden sollte. Eine Benutzung aufs Geradewohl und vor allem nach Einflechtung von anderen Kommandos, die sich mit Verzeichniseintr„gen besch„ftigen, fhrt mit Sicherheit zu weniger netten Ergebnissen. VARIABLEN 114 BEISPIEL: findfirst entry$ *.* while status <> -1 echo Ýentry$ findnext entry$ wend Diese kleine Batch-Datei zeigt alle Eintr„ge im aktuellen Verzeichnis an. Vertauscht man in diesem Beispiel im logichen Ausdruck die Seiten, also statt while status <> -1 nun while -1 <> status bricht die Batchbearbeitung nicht mehr selbstst„ndig ab, da "status" nie -1 wird. Diese Problematik der st„ndigen Ver„nderung dieses Systemparameters wurde ja bereits angesprochen. Ein sicherer Ablauf wird hier nur durch sofortiges Umkopieren nach "findfirst"/"findnext" von "status" in eine andere Variable erreicht! -> getdrv ---------------------- Dieser Befehl weist der Stringvariablen 'string_var' das aktuelle Laufwerk zu. BEISPIEL: getdrv drv$ vardump Nacheinander ausgefhrt, kann man die Wirkung dieses Kommandos erken- nen. -> getpath ----------------------- Dieser Befehl weist der Stringvariablen 'string_var' den aktuellen Pfad zu. -> if then [else ] ------------------------------------------------------ 'log-expression' kann eine der folgenden Formen haben: [not] = [not] > [not] < [not] <> [not] >= [not] <= VARIABLEN 115 'varA' bzw. 'varB' sind normale Zahlvariable (Strings sind nicht zugelassen!). Ist die "if"-Bedingung erfllt, wird 'command' ausgefhrt, sonst, falls vorhanden, der "else"-Teil. Es ist m”glich, bei der Bedingung die interne Variable "status" zu benutzen. "then" und "else" k”nnen brigens nicht durch eine Aliasersetzung umbenannt werden! BEISPIELE: if index = 22 then goto marke1 Wenn die Variable 'index' den Wert 22 hat, soll zur Marke 'marke1' gesprungen werden. if parameter <> index then stop Wenn die Variable 'parameter' ungleich der Variablen 'index' ist, wird die Bearbeitung der Batch-Datei abgebrochen. if not index = 10 then echo index ungleich 10 entspricht der Anweisung if index <> 10 then echo index ungleich 10 d.h. "not" kehrt das Ergebnis des logischen Ausdrucks um! if status <> 255 then cp *.c a: Ist die Systemvariable "status" ungleich 255, dann kopiere alle 'C'- Dateien nach Laufwerk A. let xyz 1 let x 1 if xyz < x then goto else echo wird nie ausgefhrt lbl else echo hier solls weitergehen Vermutlich soll hier zum Label 'else' gesprungen werden, da dies der Interpreter aber nicht weiá, bekommt man eine Fehlermeldung. Man muá in diesem Fall den Namen der Sprunkmarke „ndern z.B. in '_else': let xyz 1 let x 1 if xyz < x then goto _else echo wird nie ausgefhrt lbl _else echo hier solls weitergehen Mit dieser kleinen Žnderung funktioniert das Ganze jetzt. Man sollte sich vielleicht angew”hnen, Variablennamen und Sprungmarken nicht aus den Schlsselw”rtern zu w„hlen! if 1 <> 1 then echo Problem mit else else echo no problems VARIABLEN 116 Hier tritt ein neues Problem auf. Da die "if"-Bedingung nicht zutrifft, wird beim "else"-Teil weitergemacht. Der Interpreter geht nun zur ersten Zeichenfolge 'else', die er finden kann, und das ist leider falsch. Man wird mit einer Fehlermeldung belohnt. Dieses Problem l„át sich durch folgende Anweisung vermeiden: if 1 <> 1 then echo Problem%1mit%1else else echo no problems Und letztendlich noch ein kleines Beispiel, um das Zusammenspiel von "while" und "if" noch etwas zu verdeutlichen: let i 0 ; echo Schleifenanfang ; while 1 = 1 vardump if i < 10 then goto weiter_gehts else wexit lbl weiter_gehts ++ i wend ; echo Schleifenende Der Abbruch der Endlosschleife erfolgt unter Verwendung von "if" (mit "else") und "wexit" (vgl. auch die Ausfhrungen zu den Batchkomman- dos). -> inkey [-s] ------------------------ Abfrage eines Tastendrucks. Das Kommando wartet solange bis ein Tastendruck erfolgt ist. Der Wert der Taste findet sich dann in 'variable'. Um s„mtliche Tasten erfassen zu k”nnen, beinhaltet der Wert auch den Scancode! Will man sich auf den ASCII-Bereich beschr„nken, mssen durch Anwendung der "&="-Operation und einem Wert von 255, alle st”renden Bits ausgeblendet werden. fhrt bei diesem Befehl zu keinem Abbruch der Batch- Verarbeitung! M”chte man diesen haben, muá der Benutzer eine explizi- te šberprfung des Variablenwertes und die gewnschte Reaktion selber implementieren. Option | Bedeutung -------+------------------------------------------------------------ s | Unterdrckt das Warten auf einen Tastendruck. War keine | Taste gedrckt, enth„lt die Variable den Wert Null. | VARIABLEN 117 BEISPIEL: echo drcke RETURN let taste 0 while taste <> 13 inkey taste &= taste 255 wend echo ok, weiter gehts In diesem Batch-File wird solange in der WHILE-Schleife gewartet, bis der Benutzer bzw. gedrckt hat. Hier wird, wie man hoffentlich erkennen kann, von der Ausblendung des Scancodes Gebrauch gemacht. Ein anderes, vielleicht sinnvolleres Beispiel findet sich bei den Ausfhrungen zum "case"-Befehl. -> instr --------------------------------------------------------------- Kommt der Inhalt von 'string variable B' in 'string variable A' vor, wird die entsprechende Zeichenposition in 'int var' abgelegt (beginnend bei eins). Bei Nichtvorkommen erh„lt man Null als Resultat. BEISPIEL: let a$ abcdef let b$ cde instr pos a$ b$ print pos Hier wird 'pos' auf 3 gesetzt. -> leftcut ----------------------------------------- Krzen eines Stringvariableninhalts von links her (vgl. dazu auch "rightcut"). BEISPIEL: let a$ 123456 leftcut 3 a$ echo Ýa$ Wie man sieht, ist aus '123456' die Zeichenfolge '456' entstanden. -> length ------------------------------------------ Bestimmt die L„nge eines Stringvariableninhalts. -> let --------------------------------------------------- Belegen von 'var' mit dem Wert einer Zahl, dem Inhalt einer anderen Variablen oder eines Strings. VARIABLEN 118 'var' kann auch der Systemparameter "status" sein. Dies ist, auáer durch die Verwendung von externen Kommandos (sprich Programmen), die einzige M”glichkeit, daá der Wert dieser Variablen vom Benutzer direkt bestimmt werden kann! Alle anderen Befehle (wie z.B. "++" oder "-=") sind nicht anwendbar, bzw. fhren zu einer Variablen 'status', die mit dem Systemparameter nichts zu tun hat. Neben diesem Parameter gibt es noch einen zweiten, dessen Inhalt allerdings nur an eine andere Variable bergeben werden kann. Ihn selbst kann man nur durch den Befehl "time" „ndern. Dieser Parameter heiát "seconds". Er gibt die aktuelle Uhrzeit in Sekunden umgerechnet zurck. Im Gegensatz zu „lteren Interpreter-Versionen geschieht die Vergabe von Variablennamen nicht mehr so freizgig, d.h. eine gltige Bezeichnung muá mit einem Buchstaben oder Underscore ('_') beginnen. Alles andere fhrt zu einem Fehler. Man sollte auáerdem die Verwen- dung von Umlauten tunlichst vermeiden. BEISPIELE: let index 111 Die Variable 'index' wird mit 111 belegt. let index2 index Die Variable 'index2' wird mit dem Wert der Variablen 'index' belegt. let a_var 1 echo die Variable 'a_var' hat den Wert Ýa_var Hier ein Beispiel zu 'Ý'. Am besten ist, man probiert die Sache selber aus. Die folgenden beiden Anweisung fhren brigens zum selben Ergebnis: let a b und let a Ýb Ich hoffe, daá klar ist, warum. let a 1ssw Diese Eingabe fhrt zu einer Fehlermeldung, da der zweite Parameter mit einer Ziffer beginnt und deshalb davon ausgegangen wird, daá es sich um eine Zahl handelt. let b 0x1af Auch hexadezimale Zahlen lassen sich eingeben. Weitere zul„ssige Zahlenformate sind oktal und bin„r, wobei vor einer Oktalzahl ein '0o' und vor einer Bin„rzahl ein '0b' stehen muá: let a 0b1010 bzw. VARIABLEN 119 let a 0o12 entsprechen beide dezimal 10. erase let i 0 while i < 10 let jÝi i ++ i wend vardump Diese kleine Batch-Datei soll zeigen, daá es durchaus m”glich ist, eine einfache Art von Feldvariablen zu erzeugen. In diesem Fall werden die Parameter 'j0' bis 'j9' erzeugt und mit ihrem Index be- legt. let sekunden seconds let stunden sekunden /= stunden 3600 let rest stunden *= rest 3600 -= sekunden rest let minuten sekunden /= minuten 60 let rest minuten *= rest 60 -= sekunden rest echo Ýstunden:Ýminuten:Ýsekunden Dieses Beispiel zeigt die Verwendung von "seconds" zur Bestimmung der Uhrzeit. Einfacher w„re es natrlich gewesen, vom Befehl "time" Gebrauch zu machen. Eine weitere Vereinfachung ist durch die Benut- zung von Kommando "mod=" m”glich: let sekunden seconds let stunden sekunden /= stunden 3600 mod= sekunden 3600 let minuten sekunden /= minuten 60 mod= sekunden 60 if stunden > 9 then echo Ýstunden:%%l else echo 0Ýstunden:%l if minuten > 9 then echo Ýminuten:%%l else echo 0Ýminuten:%l if sekunden > 9 then echo Ýsekunden else echo 0Ýsekunden Man erkennt sofort, daá durch "mod=" die eigentliche Berechnung einfacher wird. Ich m”chte das Augenmerk aber eigentlich auf die letzten drei Zeilen, die Ausgabe der berechneten Uhrzeit auf den Bildschirm, lenken. Im vorangehenden Beispiel werden einstellige Zeitangaben auch nur einstellig wiedergegeben. Das sieht nicht besonders sch”n aus. Durch die "if".."else"-Konstrukte wird solchen Werten eine Null vorangestellt. Um einen Zeilenvorschub zu verhin- dern, wird "echo" mit '%l' benutzt, wobei das Prozentzeichen in dem Befehl vor dem "else"-Zweig zweimal vorkommen muá, da der Interpreter bei der Bearbeitung einer Zeile dieses um jeweils eins reduziert! Man VARIABLEN 120 sollte dieses Verhalten im Hinterkopf behalten. let stringvar$ Schrott Das '$'-Zeichen im Variablennamen 'stringvar' kennzeichnet diese Variable als Stringvariable. Ihr wird das Wort 'Schrott' zugewiesen. Wrden nach 'Schrott' noch weitere Worte kommen, so werden diese ignoriert! let abc$ xyz$ Dieses Kommando weist 'abc$' den String 'xyz$' zu, und nicht, wie man vielleicht erwarten wrde, den Inhalt der Variablen 'xyz$' (vgl. dazu "let$")! Will man Variableninhalte zuweisen, kann man dazu beispiels- weise 'Ý' benutzen: let abc$ Ýxyz$ fhrt also zum gewnschten Ergebnis. Mit diesem speziellen Variablentyp kann man z.B. '$'-Argumente spei- chern. Durch Verwendung von 'Ý' stehen einem aber natrlich die diversen Funktionen aus der Batchabteilung zur Verfgung! Ein kleines Problem gibt es mit 'Ý'. Durch die etwas groázge Namens- konvention bei Variablen, ist es fr den Interpreter leider ein biáchen schwierig, festzustellen, ob ein String, der mit 'Ý' beginnt, auf eine einzige Variable verweist oder teilweise aus einem Varia- blennamen und teilweise aus einem anderen String besteht. Es gelten deshalb alle Zeichen kleiner 'A', ungleich einer Ziffer und ungleich '$' als Trennzeichen, sprich, dort h”rt die Variable auf (Trennzei- chen: ' ' , '!' , '"' , '#' , '%' , '&' , ''' , '(' , ')' , '*' , '+' , ',' , '-' , '.' '/' , ':' , ';' , '<' , '=' , '>' , '?' , '\' und '@'). Ich m”chte noch betonen, daá diese Zeichen natrlich bei einer Ersetzung nicht verschwinden, lediglich Variablennamen h”ren mit Auftreten eines solchen Zeichens auf! Als Faustregel sollte man sich merken, nur Buchstaben und Ziffern in Variablennamen zu verwenden. Um das noch etwas zu beleuchten ein paar Beispiele: Ýabc$0 Hier wrde man wohl erwarten, daá erst der Wert fr die Variable 'abc' eingefgt wird. Es erfolgt aber erst die Ersetzung des Dollar- arguments. Besteht dieses z.B. aus Buchstaben, so kann auf einmal ein ganz anderer Variablenname entstehen! Eine weitere m”gliche Miádeutung in diesem Beispiel w„re es, anzuneh- men, daá man es mit der Stringvariablen 'abc$' zu tun hat. ÝabcÝabc$ Diese Zeichenfolge wird durch den Zahlenwert von 'abc' und direkt im Anschluá daran, durch den String, der sich hinter 'abc$' verbirgt, ersetzt. Wird brigens auf eine Stringvariable zugegriffen, die es noch nicht gibt, erfolgt eine Ersetzung durch ein Leerzeichen! let device$ A dir Ýdevice$:*.* VARIABLEN 121 Diese beiden Kommandos fhren zum Aufzeigen des aktuellen Directory- Inhalts auf Laufwerk 'A', wenn sie sich in einer Batch-Datei befin- den, da nur dort eine 'Ý'-Ersetzung stattfindet. let a$ "1 2 3 4" Hier sieht man einen der Grnde, warum ich in die Bearbeitung der Argumentzeile die Scherze mit den Hochkommas eingebaut habe. Strings sind jetzt nicht mehr nur auf Zeichenfolge ohne Leerzeichen beschr- „nkt. Hier h„tte man es also mit '1 2 3 4' zu tun. -> let$ ----------------------------------- M”chte ein Benutzer den Inhalt einer Stringvariablen einer anderen zuweisen, kann er dazu, wie bereits gesagt, "let" und 'Ý' verwenden. Oder er macht von diesem Kommando Gebrauch. Der Inhalt von 'string_varB', so diese Variable vorhanden ist, wird 'string_varA' zugewiesen. Dieser zus„tzliche "let"-Befehl ist notwendig wenn man, wie bei den Integervariablen m”glich, mit Pseudofeldern arbeitet (man h„tte sonst zwei 'Ý's in einem Variablennamen gebraucht, und das packt der Interpreter nicht). Beim "case-of-endcase"-Konstrukt findet sich ein Beispiel zu dieser Problematik. -> mod= ---------------------------- Fhrt die Operation varA := varA MODULO durch. Bestimmt also den Rest einer Division. -> of ----- vgl. "case"-Befehl. -> print ---------------------- Ausgabe der Variablenwerte auf dem Bildschirm. Diese erfolgt dezimal, hexadezimal und oktal. BEISPIEL: print index juhu Hier werden die Inhalte von 'index' und 'juhu' ausgegeben. -> rightcut ------------------------------------------ Krzt die 'string variable' um die angegebene Anzahl von Zeichen. VARIABLEN 122 BEISPIEL: let var$ abcdef rightcut 1 var$ In diesem Beispiel wird aus dem String 'abcdef' 'abcde'. Das letzte Zeichen wurde entfernt. -> tolower ---------------------------- Wandelt alle Groábuchstaben des Inhalts der angegebenen Variablen in Kleinbuchstaben um. -> toupper ---------------------------- Wandelt alle Kleinbuchstaben des Inhalts der angegebenen Variablen in Groábuchstaben um. -> vardump ---------- Alle vorhandenen Variablen werden mit ihren Werten auf den Bildschirm ausgegeben. Dieser Befehl verschafft dem Benutzer immer einen šber- blick, welche Variablen existieren, wie groá ihre Anzahl ist, mit welchen Werten sie gerade belegt sind und wo sie sich in der Variablenliste befinden (je weiter vorn, desto schneller der Zugriff auf sie). Die beiden Parameter "status" und "seconds" finden sich nicht in dieser Liste! Die Ausgabe der Variableninhalte erfolgt dezimal, hexadezimal und oktal. -> |= -------------------------- Logische ODER-Verknpfung einer Variablen mit einer anderen oder einer Zahl. i) Allgemeines zu den Variablen ------------------------------- Alle Variablen sind vom Typ Long-Integer (32 Bits) oder enthalten, als Stringvariablen, einen Verweis auf einen String. Neue Variablen k”nnen nicht nur durch den "let"-Befehl eingefhrt werden. Jeder Bezug auf eine Variable, die noch nicht existiert, erzeugt einen Variableneintrag und setzt den aktuellen Variablenwert auf Null (gilt nicht fr Stringvariable)! Die Variablen sind in einer Pointerliste, die den jeweiligen Variab- lennamen und Wert enth„lt, organisiert, d.h. ihre Anzahl wird nur durch den verfgbaren freien Speicher begrenzt. Allerdings gilt, daá die Zugriffszeit auf eine Variable proportional zu ihrer Position in dieser Liste ist. VARIABLEN 123 ii) Beispiele ------------- An einigen Beispielen soll gezeigt werden, daá mit Hilfe der Variablen nicht nur Z„hlschleifen in Batch-Files aufgebaut werden k”nnen. Der folgende Batch-File dient zur Compilierung, Linkung und Codever- besserung der einzelnen Sourcefiles, aus denen der Kommandointerpre- ter besteht. Die Sourcefiles heiáen im einzelnen 'COMMAND.C', 'COM.C' und 'EDI.C'. Die Batch-Datei soll nun in der Lage sein, jeden einzelnen dieser Files zu compilieren oder den Objektcode zu verbessern. Zus„tzlich muá die M”glichkeit gegeben sein, die entsprechenden Objektfiles zusammenlinken zu k”nnen, so daá 'command.prg' als Endprodukt entsteht. Jede der Anforderungen muá ber Parametereingabe an die Datei einzeln erfllt sein. Das Eingabeformat soll folgendermaáen aussehen: @cc [aktion] 'cc' repr„sentiert dabei die Batch-Datei. 'file' ist einer der oben genannten Files (ohne Extension!). [aktion] steuert das Verhalten des Batch-Files. Wird dieser Parameter weggelassen, soll der angegebene File compiliert werden, daran anschlieáend eine Code-Verbesserung durchgefhrt und zum Schluá das ganze zusammengelinkt werden. Wird fr [aktion] 'lc' oder 'cl' eingegeben wird, nur der Compiler gestartet und das ganze zusammengelinkt. Bei Eingabe von 'il' oder 'li' wird eine Code-Verbesserung durchge- fhrt und dann der Linkvorgang gestartet. 'l' resultiert in einem Linkvorgang. 'c' startet nur den Compiler. 'i' fhrt eine Codeverbesserung durchj. M”chte man den File 'COMMAND.C' compilieren und mit den anderen Files zusammenlinken, máte also @cc command lc eingegeben werden. Der File "cc": ; ; Batch-File zur Compilierung eines C-Files von 'command.prg' ; off 13 ; keine Kommandoausgabe auf Schirm cls ; ; Steuervariable ; ?arg 0 goto ok ;falls Argument(e) vorhanden, alles ; klar VARIABLEN 124 inquire Sourcefile ; wenn nicht, Sourcefilenamen anfordern lbl ok let $1 0 ; alles ausfhren let lc 4 ; compilieren und linken let cl 4 ; - " - let l 1 ; linken let c 2 ; compilieren let i 6 ; Code verbessern let il 5 ; verbessern und linken let li 5 ; - " - if $1 = 1 then goto linken if $1 > 4 then goto improve mmcc.ttp $0.c ; Compilerabteilung if status <> 0 then goto exit ; im Fehlerfall if $1 = 2 then stop ; nur Compilerlauf if $1 = 4 then goto linken lbl improve ; Improve-Abteilung mmimp.ttp $0.o if status <> 0 then stop ; Fehler aufgetreten if $1 = 6 then stop lbl linken ; Linkerabteilung mmlink.ttp command.o com.o edi.o -O command.prg lbl exit Das Arbeitsprinzip dieses Beispiels ist hoffentlich klar. Es basiert auf der Ersetzung von '$'-Platzhaltern, in diesem Fall von '$1'. Wird kein zweites Argument an den File bergeben, erfolgt auch an keiner Stelle eine Ersetzung, d.h. es werden alle Aktionen durchgefhrt. Dies kann man brigens auch dadurch erreichen, daá ein nicht vorhan- dener Parameter, z.B. 'xyz', bergeben wird. Bei den Vergleichsoperationen muá man sich nun einfach vorstellen, daá vor Ausfhrung einer solcher Aktion '$1' durch den eingegebenen Parameter ersetzt wird. Bei der Befehlseingabe @cc command lc also durch 'lc'. Der Benutzer sollte dies an dem vorliegenden Beispiel einmal durchspielen. Es ist relativ einfach, diesen File an eigene Bedrfnisse anzupassen. Die Vorgehensweise drfte keine gr”áeren Verst„ndnisprobleme aufwer- fen. Das n„chste Beispiel befaát sich mit 'Ý' und dem Kommando "cal": let jahr 1980 on 18 while jahr < 1991 let monat 1 echo %nKalender fr Ýjahr %n while monat < 13 cal Ýmonat Ýjahr ++ monat wend ++ jahr wend echo VARIABLEN 125 Man erinnere sich, "cal" gibt zu einem bestimmten Monat eine Art Kalenderblatt aus (eine Beschreibung findet sich im Abschnitt 'Externe Kommandos und Utilities'). Der vorliegende Beispielbatchfile holt sich die Ausgabe fr ein ganzes Jahrzehnt. Das letzte Beispiel soll grob die Funktion des externen Kommandos "getfiles" simulieren: ?arg 0 goto Argument lbl fehler echo Aufruf stop ; lbl Argument ?arg 1 goto fehler ls $0 >dir.dat cleararg openarg dir.dat getarg let dir$ $1 tolower dir$ cleararg getarg left $0 - stop ;nichts gefunden repeat ;dir.dat abklappern while ?arg 0 ;eine Zeile abarbeiten let datei$ $0 shiftarg right Ýdir$ \ rightcut 1 dir$ findfirst datei$ Ýdir$\Ýdatei$ let attribut status &= attribut 24 ;nur Dateien tolower datei$ if attribut = 0 then echo Ýdir$\Ýdatei$ wend getarg until status = 255 ; ;Aufr„umen: ; erase rm dir.dat Es wird nicht wie bei "getfiles" eine Datei 'getfile.dat' erzeugt, sondern direkt auf den Bildschirm ausgegeben. Auáerdem sorgt das Kommando "&= attribut 24" dafr, daá nur Dateien betrachtet werden. "findfirst" wird nur zur Bestimmung des Dateiattributs benutzt, nicht zum eigentlichen Auffinden von Ordnereintr„gen oder Dateien! Dies wurde bereits von Kommando "ls" besorgt. "getarg" sorgt fr das zeilenweise Abklappern der Datei 'dir.dat'. EDI 126 VIII. EDI ========= i) Einfhrung ------------- EDI ist ein zeilenorientierter (Primitiv-) Editor. Er soll zur schnellen Modifikation von Kleinigkeiten in Batch-Files o.„. dienen. Zum Schreiben von Programmen oder zum Betreiben von Textverarbeitung sollte man einen anderen Editor verwenden (z.B. TEMPUS, EMACS, PKS- EDIT...). Der Vorteil dieses eingebauten Programmteils liegt in der schnellen Verfgbarkeit; Ladezeiten, wie sie fr die Verwendung eines externen Editors ben”tigt werden, entstehen nicht. Der Aufruf erfolgt mit -> edi ----------------- Jede eingelesene Zeile darf h”chstens 76 Zeichen lang sein! Kommen l„ngere Zeilen vor, erfolgt ein Stutzen der Zeile (ohne Warnung!). Tabulatorzeichen werden in Blanks umgewandelt (daran kann man erken- nen, wie einfach der Editor ist)! Bei Angabe eines nichtexistenten Files, wird dieser bei Verlassen von EDI (via 's') erzeugt. Es wird keine Warnung ausgegeben, daá eine nichtvorhandene Datei angegeben worden ist! ii) Die Kommandos von EDI ------------------------- Es gilt jeweils der in die Hochkommas eingeschlossene Buchstabe, die -Taste wird zum Abschlieáen der Eingabe nicht benutzt! 'a'(ppend) Zeilen anfgen ------------------------- Anfgen von neuen Zeilen an das Fileende. Abbruch wie immer mit . 'd'(delete) Zeilenl”schen ------------------------- Es wird der zu l”schende Bereich angefordert. 'e'(dit) Edieren einer Zeile ---------------------------- Nach Eingabe von 'e' wird eine Zeilennummer angefordert. Das eigent- liche Edieren geht genau wie bei der Eingabe von Kommandos, also mit den Cursortasten u.s.w. Sollen eingegebene Žnderungen nicht bernom- men werden, kann mit ein Abbruch des Kommandos durchge- fhrt werden. 'f'(ind) Stringsuche -------------------- Sucht nach einem bestimmten String innerhalb von Zeilen. Jede Zeile, in der der einzugebende String vorkommt, wird ausgegeben. EDI 127 'h'(elp) Hilfe -------------- Auflisten der vorhandenen Befehle mit einer kurzen Beschreibung sowie Angabe des aktuellen Files. 'i'(insert) neue Zeilen anfgen ------------------------------- Es wird die Nummer der Zeile angefordert, vor der die neuen Zeilen eingefgt werden sollen. Abbruch dieses Modus mit . 'l'(ist) Auflisten des eingelesenen Files ----------------------------------------- Es wird nach Eingabe von 'l' der gewnschte Zeilenbereich angefor- dert. Wird bei 'START:' einfach nur gedrckt, erfolgt ein komplettes Auflisten des Files. Ein vorzeitiges Abbrechen des Listvorgangs ist mit m”g- lich. unterbricht die Ausgabe, durch erneutes Bet„tigen von wird dann wieder fortgefahren. 'n'(ew) Gesamtl”schung ---------------------- L”scht alle Zeilen. Es findet eine Sicherheitsabfrage statt. 'p'(rint) Printerausgabe ------------------------ Der analoge Befehl zu 'list'. Die Ausgabe erfolgt allerdings auf den Drucker. Die Druckerinformationen und Einstellungen des "lp"-Kommandos werden nicht bercksichtigt! Es handelt sich wirklich nur um eine Ausgabeum- leitung des 'list'-Befehls. 'r'(eplace) Stringersetzung --------------------------- Es muá dabei angegeben werden, ob vor dem Ersetzungsvorgang eine Sicherheitsabfrage (Best„tigung durch den Benutzer) erfolgen soll oder nicht. 's'(ave) Abspeichern und Verlassen ---------------------------------- Abspeichern der Datei und verlassen von EDI. (e)'x'(it) Beenden ------------------ Verlassen von EDI ohne abspeichern. FEHLERMELDUNGEN 128 IX. Fehlermeldungen =================== Der Interpreter gibt zahlreiche Fehlermeldungen aus. Diese sind hier mit einer kurzen Beschreibung zusammengefaát. Man darf allerdings nicht erwarten, daá 'command.prg' Korrekturvorschl„ge macht. "missing argument(s)" Fehlernr.:1 Es gibt halt Befehle, die erwarten einfach ein Argument oder wenn sie ganz unversch„mt sind, gleich mehrere. "directory isn't empty" Fehlernr.:2 Hier wurde versucht, ein nicht leeres Verzeichnis zu l”schen. "can't delete directory" Fehlernr.:3 Man sollte nur Ordner entfernen, die es auch wirklich gibt. "wrong commandsyntax or argument" Fehlernr.:4 Kann bei der Zahlenkonvertierung auftauchen oder wenn Befehle mit unpassenden Argumenten versorgt werden. "printer not connected" Fehlernr.:5 Entweder Printer online stellen oder das Ding einfach mal einschal- ten. "can't open file" Fehlernr.:6 Passiert, wenn ein File nicht gefunden werden kann. "can't delete file" Fehlernr.:7 Kommt vor, wenn "rm" es nicht schafft einen File zu l”schen. Zum einen passiert dies, wenn es den File nicht gibt, zum anderen kann der File auch vor L”schen geschtzt sein ('read-only'-Attribut. "command not found" Fehlernr.:8 Kann eine Eingabe nun berhaupt nicht verarbeitet werden, kommt diese Meldung. "too many arguments" Fehlernr.:9 Manche Befehle wollen berhaupt kein Argument, andere nur eine be- stimmte Anzahl. Bei šberftterung st”át man dann auf diese Meldung. "argument out of range" Fehlernr.:10 Wird ausgegeben, wenn beim "time"-Kommando bzw. beim "date"-Befehl ein fehlerhaftes Argument angegeben worden ist. FEHLERMELDUNGEN 129 "too many batch-files" Fehlernr.:11 Es drfen maximal zwanzig Batch-Dateien ge”ffnet sein. "use only in batch-files" Fehlernr.:12 Es gibt Kommandos die nur dort Sinn haben (z.B. "restart"). "label not found" Fehlernr.:13 Eine Marke konnte nicht gefunden werden. "can't create file" Fehlernr.:14 Es war, aus was fr Grnden auch immer, nicht m”glich, einen File zu erstellen. "Frename() failed" Fehlernr.:15 "mv" konnte nicht ordnungsgem„á durchgefhrt werden. "wrong directory" Fehlernr.:16 Kommt beim versuchten Wechsel in einen nicht vorhandenen Ordner vor. "don't use '*' or '?'" Fehlernr.:17 Kommt bei einigen Befehlen vor, die sich nur auf Einzelfiles anwenden lassen. "can't execute '.acc'-files" Fehlernr.:18 Der Interpreter ist nicht in der Lage, Deskaccessories direkt auszuf- hren (vgl. dazu externes Kommando "acc"). "directory exists" Fehlernr.:19 Ein Ordner kann nicht zweimal gebastelt werden. "can't create directory" Fehlernr.:20 Aus irgendwelchen Grnden kann die Erzeugung eines Ordners nicht vorgenommen werden (z.B. Schreibschutz). "'!'-argument not in range" Fehlernr.:21 Es wurde versucht auf einen alten Befehl zuzugreifen, der nicht in der History-Liste ist. "relation unknown" Fehlernr.:22 Problemchen bei den "if"-Bedingungen in der Variablenabteilung. "not enough disk-space" Fehlernr.:23 Bedeutung drfte klar sein. FEHLERMELDUNGEN 130 "cyclic alias entry" Fehlernr.:24 Dieser Fehler taucht auf, wenn der Interpreter nach 100 Alias Er- setzungen immer noch in der Ersetzschleife steckt (vgl. auch "newalias"). "can't change mode" Fehlernr.:25 Findet beim "chmod"-Befehl Verwendung. "can't read file" Fehlernr.:26 Wird ausgegeben, wenn eine Datei via "getarg" nun wirklich nicht gelesen werden kann. "option not possible" Fehlernr.:27 Kommandos, wie z.B. "cp" oder "rm", die die Verwendung bestimmter Optionen zulassen, l”sen diese Fehlermeldung aus, wenn eine nicht m”gliche Option angegeben worden ist. "couldn't find 'wend'" Fehlernr.:28 Da hat jemand eine WHILE-Schleife aufgemacht und vergessen, daá man dazu auch ein "wend" braucht. Dieser Fehler tritt auf, wenn bei der Suche nach einem solchen "wend" das Ende einer Batch-Datei erreicht worden ist. "'wend' without 'while'" Fehlernr.:29 Der Interpreter ist auf ein "wend" gestoáen ohne sich in einer WHILE- Schleife befunden zu haben. "'while' error abort batch.com" Fehlernr.:30 Mit "off 2" kann man den Interpreter veranlassen, nach dem Auftreten eines Fehlers die Bearbeitung einer Batch-Datei nicht zu beenden. Es gibt aber Situationen, die beim Auftreten eines Fehler in Verbindung mit einer WHILE-Schleife ohne Abbruch, eigentlich nur Chaos veran- stalten k”nnen. Deshalb wird dort unter allen Umst„nden abgebrochen! "no while loop open" Fehlernr.:31 Es wurde versucht, "wexit" anzuwenden, ohne daá man sich in einer WHILE-Schleife befunden hat. "device error" Fehlernr.:32 Wird beim "df"-Kommando ausgegeben, wenn man auf ein Laufwerk zugreift, daá nicht existiert oder bei Zugriff auf ein Diskettenlauf- werk keine Diskette eingelegt ist. "'until' without 'repeat'" Fehlernr.:33 Der Interpreter ist auf ein "until" gestoáen, ohne vorher ein FEHLERMELDUNGEN 131 passendes "repeat" gefunden zu haben. "EOF without 'endcase'" Fehlernr.:34 Der Benutzer hat es vers„umt, eine "case"-Folge ordnungsgem„á mit einem "endcase" abzuschlieáen. "'case' missing" Fehlernr.:35 Der Interpreter ist auf ein "of" bzw. "endcase" gestoáen, ohne ein passendes "case" dafr zu haben. "environment variable not found" Fehlernr.:36 Wird bei "delenv" gemeldet, wenn Eintrag nicht gefunden werden kann. "can't write boot sector" Fehlernr.:37 Wird bei "format" gemeldet, wenn der Boot-Sektor nicht auf der Dis- kette angebracht werden kann. "missing "'"" Fehlernr.:38 Wird bei "trans" ausgegeben, wenn Zeichenangabe nicht korrekt ist (bei Zeichenangabe mit Anfhrungszeichen). "wrong format" Fehlernr.:39 Wie vorhergehender Fehler, nur diesmal bei den anderen m”glichen Angabeformen. "code out of boundary" Fehlernr.:40 "trans" akzepiert nur Angaben im Bereich 0 - 255. "bad blocks" Fehlernr.:41 Wird bei "format" gemeldet, wenn beim Formatieren ein nicht formatierbarer Block auf der Diskette aufgetaucht ist. "option type mismatch" Fehlernr.:42 Werden Optionen angegeben, die nicht zueinander passen, st”át man auf diese sch”ne Meldung. "can't write file" Fehlernr.:43 Die Ausgabe in eine Datei hat nicht funktioniert. "'fseek()' failed" Fehlernr.:44 Das Aufsetzen an einer bestimmten Stelle innerhalb einer Datei hat nicht funktioniert. FEHLERMELDUNGEN 132 "illegal device" Fehlernr.:45 Die Ein- oder Ausgabe soll auf ein unzul„ssiges Laufwerk erfolgen. "wrong floppy format" Fehlernr.:46 Es wird ein bestimmtes Diskettenformat erwartet. Dieser Fehler drfte inzwischen nicht mehr auftauchen. "not enough memory" Fehlernr.:47 Diese Fehlermeldung gilt nur fr externe Kommandos. Der Interpreter selbst wrde sofort abbrechen, wenn kein freier Speicher mehr verfg- bar w„re! Es gibt einige Fehler, die zum sofortigen Programmstop des Interpre- ters fhren. Sollte es nicht mehr m”glich sein, RAM-Platz fr Eintr„ge, wie z.B. die History-Liste oder ALIAS, zu beschaffen, tritt ein solcher Abbruch auf. Das Programm wird brigens gar nicht erst gestartet, wenn der Reservierungsversuch des Interpreters sich ca. 20k RAM zu besorgen, fehlschl„gt. Man sollte dann seine RAM-Disk etwas kleiner machen oder einige Accessories entfernen. Ist ein Fehler aufgetreten enth„lt "status" die Fehlernummer. Bei den externen Kommandos habe ich mich nicht immer an diese Fehler- meldungen bzw. ihre Nummern gehalten. Zum Teil ist hier bereits Abhilfe geschehen, aber halt nicht berall. Normalerweise drfte man aber auch in diesen F„llen klar kommen. Auf die Rckgabecodes sollte man sich deshalb erst nach eingehenden Tests verlassen (so man sie berhaupt benutzt)! EIN-/AUSGABEUMLEITUNG 133 X. Die Ausgabeumleitung ======================= Die meisten Befehle mit Textausgabe erlauben es, diese in einen File umzuleiten. Dies wird durch '>' angegeben. Eine doppelte Angabe von '>' bedeutet das Anh„ngen der Ausgabe an eine bereits bestehen- den Datei. Der Wunsch nach einer solchen Umleitung kann meistens an beliebiger Stelle innerhalb der Argumentliste stehen. šbrigens, kommen mehrere solche Umleitungswnsche in der gleichen Argumentangabe vor, wird nur der erste beachtet. Alle weiteren werden als ganz normale Eingabepa- rameter weitergegeben und drften wohl in den meisten F„llen durch die Funktionsweise der einzelnen Kommandos zu einer Fehlermeldung fhren. BEISPIELE: find -t >tree.txt Die Ordnerstruktur wird in den File 'tree.txt' geschrieben. dir *.prg >prg.dat Das "dir"-Kommando schreibt alle '.PRG'-Dateinamen in den File 'PRG.DAT'. dir >>prg.dat *.ttp Sollte die Datei 'PRG.DAT' bereits vorhanden sein, so h„ngt diese Eingabe alle '.TTP'-Filenamen an das Dateiende an. Andernfalls wird der File neu erzeugt. Wird die Umleitung bei Kommandos angewandt, die diese M”glichkeit nicht bieten, hat dies das Anlegen einer leeren Ausgabedatei zur Folge. Unangenehm wird es allerdings wenn, z.B. mit "od", ein Ausgabefile vom Ausgabefile gemacht werden soll. Der File geht dann n„mlich verloren! Es kann brigens auch auf Ger„tschaften ausgegeben werden. dir >PRT: sendet z.B. seine Ausgabe zum Druckerport (Centronics-Schnittstelle). Eine Besonderheit der externen Kommandos muá an dieser Stelle erw„hnt werden. Wird bei diesen auf Devices ausgegeben, so muá dazu '>>' ver- wendet werden und nicht '>' (eine Ausnahme macht allerdings 'PRT:', da ist es, aus was fr Grnden auch immer, egal)! Diese Eigenart gilt fr Programme, die mit TURBO-C erstellt worden sind. Da ich das ganze nicht immer wieder ausprobiere, kann es sein, daá sie sich mit neuen Versionen dieses Compilers verflchtigt. Das festzustellen, berlasse ich vertrauensvoll dem Anwender. PRT: Umleitung zum Drucker (auch PRN:) CON: Umleitung zur Konsole AUX: zur RS-232 Schnittstelle (nicht getestet!) MIDI (nicht getestet) EIN-/AUSGABEUMLEITUNG 134 ACHTUNG: In „lteren Interpreterversionen wurde statt '>' das '|'- Zeichen benutzt! Es kann vorkommen, daá man '>' nicht als Angabe einer Ausgabeumleitung verstanden haben will. Dann muá vor diesem Zeichen ein '%' stehen: echo %>abc wrde also zur Ausgabe von '>abc' auf dem Bildschirm fhren und nicht zum Anlegen der Datei 'abc'. EIN-/AUSGABEUMLEITUNG 135 XI. Die Eingabeumleitung ======================== Eine analoge Funktion zum Umleiten der Ausgabe gibt es auch fr die Eingabe. '<' mit direkt anschlieáendem Filenamen (z.B. ' abgebrochen Man sollte hier beachten, daá z.B. das Schlieáen aller Batch-Dateien nicht zwangsl„ufig einen Abbruch der Umleitung zur Folge hat! Das folgende Beispiel soll verschieden M”glichkeiten aufzeigen, drei bestimmte Dateien auf Laufwerke I zu kopieren: cp b:dat.1 i: cp e:dat.2 i: cp a:dat.3 i: Die umst„ndlichste M”glichkeit ist die Ausfhrung von drei "cp"- Kommandos. cp b:dat.1,e:dat.2,a:dat3 i: EIN-/AUSGABEUMLEITUNG 136 Schon weniger umst„ndlich. Und jetzt mit Eingabeumleitung ausgehend von der Datei 'uml.dat', die die drei folgenden Zeilen enth„lt, b:dat.1 e:dat.2 a:dat.3 wrde auch der Befehl cp stop ; lbl StartIt let command$ $0 shiftarg while ?arg 0 let Descriptor$ $0 right $0 \ +string Descriptor$ *.* right $0 : +string Descriptor$ *.* getfiles -x24 ÝDescriptor$ ; -x24 = nur Dateien Ýcommand$ ... then ... [else ...] bedingte Anweisung if [not] ... <> ... then ... [else ...] bedingte Anweisung if [not] ... >= ... then ... [else ...] bedingte Anweisung if [not] ... <= ... then ... [else ...] bedingte Anweisung ifarg Befehl ausfhren, wenn zwei Strings gleich inkey auf Tastenbet„tigung warten, Wert in Variable inquire Benutzereingabe in Batch-Dateien instr Test, ob Zeichenfolge bestimmten String enth„lt inverse Bildschirmdarstellung umschalten keyboard Ausgabe Tastenbedeutungen keys Ausgabe der Funktionstastenbelegungen lbl Marke setzen left Stringvergleich leftcut krzt Stringparameter ANHANG 143 length L„nge eines Strings let Variable belegen let$ Stringvariablen an Stringvariablen zuweisen lock Rechner sperren lp File(s) ausdrucken lpmargin linker Rand bei Listings lppage Anzahl der Seite pro Seite bei Listings ls File(s) auflisten man Beschreibung aus 'command.txt' zu einem Kommando aus- geben merge Files verbinden mkdir neuen Ordner erzeugen mod= Bestimmung von Divisionsrest more File(s) ausgeben mouseoff Mauszeiger ausschalten mouseon Mauszeiger einschalten mv File umbenennen newalias Neubelegung einfhren newserno Diskette neue Seriennummer geben od Filedump of Vergleichstest in "case".."of".."endcase"-Folge off Flag rcksetzen oldy wenn File 1 „lter ist als File 2, dann fhre Befehl aus on Flag setzen openarg externe Datei, die $-Parametern enth„lt, ”ffnen page Listings mit Seitennummern versehen pagelp Steuercodes vor jeder neuen Seite bei Druckerausgabe passwd Passwortprogramm fr AUTO-Ordner paste Zusammenfassung von Dateizeilen path Angabe eines Suchpfades prgext Einfhren neuer Extensions fr 'PRG'/'APP'-Dateien print Variablenwert ausgeben purge l”scht alle Dateiversionen pwd Ausgabe des aktuellen Pfades quickdel L”schen eines Laufwerks repeat..until Schleifenkonstrukt reset Rechner zurcksetzen resetlp Printerinitialisierung restart an Batch-Fileanfang springen return Rcksprung aus Unterprogramm rev umgekehrte Ausgabe von Zeilen bei ASCII-Dateien right Stringvergleich rightcut krzt Stringparameter rm File(s) l”schen rmdir Ordner l”schen save File(s) nur lesbar savealias Belegungen abspeichern sed einfacher Stream Editor setarg setzen von '$'-Argumenten setlp Printerinitialisierung settab Tabulator setzen shiftarg verschieben von '$'-Argumenten size0 Test, ob File nicht vorhanden sort sortieren von ASCII-Dateien split aufspalten von ASCII-Dateien ANHANG 144 status Status ausgeben stop Batch-File stoppen string Stringsuche in Dateien sum Prfsummenberechnung zu einer Datei tab Umwandlung fhrende Leerzeichen -> TABs tail Dateiende ausgeben time Zeit ausgeben/setzen tolower Stringvariableninhalt umwandeln in Kleinbuchstaben tosext Einfhren neuer Extensions fr 'TOS'/'TTP'-Dateien toupper Stringvariableninhalt umwandeln in Groábuchstaben trans Codeumwandlung von Zeichen in Dateien unsave File(s) les- und schreibbar vardump Variable ausgeben version Erstellungsdatum ausgeben wait entweder auf Tastendruck warten oder auf Zeitablauf wc Zeilen und Zeichen und Worte z„hlen wend Ende einer WHILE-Schleife wexit Abbrechen einer WHILE-Schleife which Anzeigen, welche Datei aufgerufen werden wrde while Beginn einer WHILE-Schleife wipeout L”schen/šberscheiben der Daten auf einem Laufwerk wordtext Umwandlung 1st-Word-Dateien in Textdateien xref erzeugen von Crossreference-Liste zu C-Code Ich hoffe, daá ich in diese Liste alle vorhandenen Befehle aufgenom- men habe. Sie soll lediglich als Gedankensttze dienen! Die vollst„ndige Syntax zu einem bestimmten Befehl ist den vorangehenden Ausfhrungen zu entnehmen. Im Anhang findet sich ein Index, der ein schnelles Auffinden der gesuchten Kommandos erm”glicht. ANHANG 145 B. ANHANG (News) Dieser Abschnitt soll in kurzer Form auf die Neuigkeiten des Inter- preters hinweisen. Er kann dabei natrlich nicht die vorangehenden Erkl„rungen ersetzen, aber zum Vermitteln eines šberblicks fr Benutzer „lterer Versionen ist er ganz gut geeignet. Ich m”chte noch betonen, daá die folgenden Ausfhrungen keinen(!) Anspruch auf Vollst„ndigkeit erheben und durch die Eintragungen in chronologischer Reihenfolge wohl einen etwas konfusen Eindruck hin- terlassen. neue Kommandos: --------------- - wipeout : L”schen/šberschreiben der Daten auf einem Laufwerk - delequ : L”schen doppelter Dateien - prgext : Angabe neuer Erweiterungen fr 'PRG'/'APP'-Dateien - tosext : Angabe neuer Erweiterungen fr 'TOS'/'TTP'-Dateien - fcrypt : Direktes Verschlsseln von Dateien - diskcopy : Kopieren zweier Disketten - bigfile : Aufspalten/Restaurieren von Dateien mit šberl„nge - equal : gemeinsame Zeilen zweier Dateien ausgeben - ?flag : Bestimmung, ob Flag gesetzt ist oder nicht - clist : Ausgabe von C-Dateien mit Anzeige der Blockschachte- lungstiefe entfernte Kommandos: -------------------- - $ - # - \ sonstige Žnderungen und Anmerkungen: ------------------------------------ - 'sort' bzgl. Geschwindigkeit auf die Sprnge geholfen und Option 'm' eingebaut - in 'find' Option 'b' eingebaut (Sortierung nach Dateigr”áe) - in 'string' Option 'l' eingebaut (Ausgabe auf Dateinamen be- schr„nken) - in 'reset' Option 'c' fr einen Kaltstart eingefhrt - '%>' ('%<') wird zu '>' ('<'). Also kein Einschalten einer Umleitung - '$$' wird zu '$' (keine Argumentersetzung in Batch-Dateien) - 'inverse.tos' zum einfachen Invertieren des Bildschirms - in 'format' Option 'h' zur erweiterten Formatierung eingebaut - in 'format' Option 'v' zur Durchfhrung eines Verifys eingebaut - in 'rm' Option 'w' zum šberschreiben zu l”schender Dateien ein- gebaut - in 'erasef' Option 'w' zum šberschreiben zu l”schender Dateien eingebaut - Fehler aus 'cmp'-Kommando entfernt - 'dcopy' vergiát jetzt keine Dateien mit 'hidden'-Attribut mehr, das gilt auch fr 'erases' - Option 'w' bei 'erases' zum šberschreiben von Dateien vor dem ei- gentlichen L”schvorgang eingebaut - Steuerung der Tabulatorweite bei einigen externen Kommandos ber Environment-Variable 'TAB' ANHANG 146 - 'find' liefert bei Option 'v' Bitfolge des Dateiattributes (ana- log 'dir') - Option 'p' zum Rcksetzen von Dateiattributen in 'cp' eingebaut - in 'grep' jetzt keine Probleme mit '-x' und Filedeskriptoren mehr - bei eingeschaltetem 'MORE' in die internen Kommandos und "man" eingebaut. Damit wird nur eine halbe Bildschirmseite weitergebl„ttert - 'cp' l”scht jetzt bei einem fehlgeschlagenen Kopiervorgang oder Abbruch mit die entsprechende Zieldatei - Flag 21 zum Abschalten der Fehlerausgabe des Interpreters - oktales und bin„res Zahlenformat bei Variablenoperationen einge- fhrt INDEX 147 Index ===== ; 87, 141 ! 85, 141 !! 85 ?arg 87, 141 ?batch 141 ?flag 88, 141 ?stop 141 $ 39, 87, 89, 91, 97, 141, 143 $# 89 ++ 107, 118, 141 += 107, 141 +string 108, 141 -- 108, 141 -= 108, 118, 141 *= 107, 141 / 31 /= 108, 141 ^= 109, 141 < 114 <= 114 <> 114 = 114 > 114 >= 114 % 18 # 39, 141 &= 107, 141 @ 88, 141 \ 31, 39, 141 |= 122 ~ 86 2* 108, 141 2/ 109, 141 Alias 32, 81, 141 alias.dat 80, 81, 82 appendenv 7, 141 auto.com 43, 86, 104 batch 89, 141 bell 8, 141 break 91, 141 case 109, 131, 141 cat 8, 36, 141 cd 9, 11, 38, 141 chr 113, 141 clear 113, 141 cleararg 91, 141 cls 11, 141 cmp 11, 141 command.hlp 23, 138 cp 6, 11, 12, 141 crsoff 14, 141 crson 15, 141 date 15, 128, 141 INDEX 148 defkey 15, 141 delalias 81, 141 delenv 16, 131, 141 device 16, 142 df 16, 130, 142 dir 17, 142 DOS-Routinen Dsetdrv() 9 Dsetpath() 9 Fattrib() 43 Frename() 129 Malloc() 12, 23 Mfree() 23 echo 18, 142 edi 126, 142 EDI-Kommandos 'a'(ppend) 126 'd'(delete) 126 'e'(dit) 126 'f'(ind) 126 'h'(elp) 127 'i'(insert) 127 'l'(ist) 127 'n'(ew) 127 'p'(rint) 127 'r'(eplace) 127 's'(ave) 127 (e)'x'(it) 127 else 114, 142 endcase 109, 131, 142 env 7, 19, 142 Environment-Variable MANUAL 7, 66 SORT 7, 73 TAB 7, 41 erase 113, 142 error 20, 142 exist 91, 142 exit 20, 142 Externe Kommandos acc 41, 141 ascii 41, 141 bigfile 41, 141 cal 43, 141 chmod 43, 130, 141 clist 45, 141 compress 45, 141 crypt 46, 141 dcopy 47, 141 dcrypt 49, 141 delequ 50, 142 diskcopy 50, 142 drucker 50, 142 emore 50, 142 enttab 52, 142 equal 52, 142 INDEX 149 erasef 52, 142 erases 53, 142 fcrypt 54, 142 fct 55, 142 find 55, 142 format 57, 131, 142 getfiles 57, 142 grep 58, 142 head 63, 142 inverse 64, 142 inverse.tos 64 keyboard 65, 142 lock 65, 143 man 65, 143 merge 66, 143 newserno 67, 143 od 67, 143 passwd 68, 143 paste 69, 143 purge 69, 143 quickdel 70, 143 rev 70, 143 save 70, 143 sed 71, 143 sort 72, 143 split 74, 143 sum 75, 144 tab 75, 144 tail 76, 144 trans 76, 131, 144 unsave 77, 144 wc 77, 144 wipeout 78, 144 wordtext 78, 144 xref 79, 144 fast copy 13 Fileaatribut 44 Fileattribut 17, 43, 141 findfirst 113, 142 findnext 113, 142 flags 12, 20, 142 free 23, 142 Funktionstaste 15, 24, 141 getalias 81, 142 getarg 91, 130, 142 getdrv 114, 142 getpath 114, 142 gosub 92, 142 goto 93, 142 h 85, 142 help 23, 142 history.dat 84 if 114, 129, 142 ifarg 93, 142 inkey 116, 142 inquire 93, 142 INDEX 150 instr 117, 142 keys 24, 142 lbl 94, 142 left 95, 142 leftcut 117, 142 length 117, 143 let 117, 143 let$ 121, 143 lp 24, 127, 143 lpalpha.dat 25 lpmargin 23, 26, 143 lppage 23, 26, 143 ls 26, 143 mkdir 26, 143 mod= 121, 143 more 27, 36, 143 mouseoff 28, 143 mouseon 29, 143 mv 29, 129, 143 newalias 81, 130, 143 not 96, 101, 114, 142 of 109, 131, 143 off 29, 143 oldy 95, 143 on 12, 30, 143 openarg 91, 95, 143 page 23, 30, 143 pagelp 30, 143 Parameterbergabe ARGV 7 xArg 6, 7 path 31, 40, 143 prgext 32, 143 print 121, 143 pwd 33, 143 repeat 96, 131, 143 reset 33, 143 resetlp 34, 143 restart 97, 129, 143 return 92, 97, 143 right 97, 143 rightcut 121, 143 rm 34, 128, 143 rmdir 36, 143 savealias 82, 143 seconds 38, 118, 119 setarg 97, 143 setlp 36, 143 settab 23, 36, 143 shiftarg 98, 143 size0 98, 143 status 99, 118, 132, 144 stop 91, 99, 144 string 37, 144 then 114, 142 time 37, 128, 144 INDEX 151 tolower 122, 144 tosext 38, 144 toupper 122, 144 tree 56 until 96, 130, 143 vardump 122, 144 version 38, 144 wait 100, 144 wend 100, 130, 144 wexit 100, 130, 144 which 38, 144 while 101, 144 Wildcards 3 Ý 107