,--------------------------------------------------------------------.
|                                                      18.12.1994    |
| CLI.TXT                                                            |
|                                                                    |
| Beschreibung des Command Line Interpreter (CLI) im noDesktop V3.00 |
|                                                                    |
| Copyright 1994 by no|Software GmbH                                |
|                                                                    |
| Autoren:                                                           |
|    Ralph Mertens                                                   |
|    Andreas Fahrig                                                  |
|    Christian Stamm                                                 |
|    Marco Zahnen                                                    |
|                                                                    |
`--------------------------------------------------------------------'


Inhalt
======
1 ......................................................... Einleitung
2 ........................ Direkte Tastatureingabe / Die Shell des CLI
3 ............................................... Die Command-Language
3.1 ........................................... Aufbau eines Kommandos
3.2 ........................................ Schalterargumente (flags)
3.3 ................................... Umlenkung der Ein- und Ausgabe
3.4 ...................................................... Metazeichen
3.5 ......................................................... Modifier
3.5.1 ............................................. Execution-Modifier
3.5.2 .................................................. Path-Modifier
3.6 ........................................ Ausgabe von Sonderzeichen
3.7 ........................................................ Variablen
3.8 ............................................. Bedingte Anweisungen
3.9 .......................................................... Aliases
3.10 ................................................. History - Liste
4 ........................................... Parsing und Substitution
4.1 ............................................. History-Substitution
4.1.1 ............................................. Zeilensubstitution
4.1.2 ............................................... Wortsubstitution
4.2 ............................................... Alias-Substitution
4.3 .................................... Parsing und Makrosubstitution
4.4 ............................................ Variablensubstitution
4.4 .................................. Verhinderung von Substitutionen
4.6 ....................................... Ausfhrung eines Kommandos
5 ............................................................ Scripte
6 ................................................... Die WCON-Fenster
6.1 ....................................... ffnen eines WCON-Fensters
6.2 ...................... Programmunterbrechung in einem WCON-Fenster
6.3 .......................... VT52-Funktionalitt eines WCON-Fensters
6.4 ...................... Primitive Terminal-Fenster (WAUX und WTALK)
7 .................................................. Interne Kommandos
7.1 ....................................... Graphikmodus und Textmodus
7.2 ...................................... Ausgabe von Fehlermeldungen
8 ..................................................... Fensternummern

Anhang
A1 ............................. bersicht ber die internen Variablen
A2 .............................. besondere CLI-Anweisungen:
                                        return
                                        goto
                                        if, then, else, elif, endif
                                        foreach, end, break, continue
                                        while, wend, break, continue




1  Einleitung
=============

Der CLI des noDesk bildet die zentrale Schnittstelle zwischen der Desktop-
Oberflche und dem Benutzer. hnlich dem 'csh' unter UNIX dient der CLI
der bersetzung von Befehlen oder Programmen und deren Bearbeitung.

Der CLI tritt in drei verschiedenen Fllen in Aktion:
1. im Dialog mit dem Benutzer bei der direkten Eingabe ber die Tastatur
   (im WSH-Fenster)
2. bei der Bearbeitung von Scripten (Dateien, die eine Befehlsliste
   enthalten [*.NDS])
3. bei der Bearbeitung von Befehlssequenzen, die in der Definitionsdatei
   fr Desktop-Ereignisse abgelegt sind.

Die Funktionsweise des CLI, Namenskonventionen und Syntax sind dem 'csh'
angelehnt. Im Folgenden wird die Benutzerschnittstelle des CLI als die
'shell' (Muschel) bezeichnet.


2  Direkte Tastatureingabe / Die Shell des CLI
==============================================

Um zur direkten Eingabe zu gelangen, drckt man gleichzeitig [SHIFT] und
[ENTER](auf der Zehnertastatur) oder whlt per RECHTS-KLICK im Dropdown-
Men des Desktop den Punkt 'noDesk-CLI'.
Die Shell des CLI dient als 'Medium', um vor allem Programme aufzurufen
und Kommandos auszufhren.
noDesk hat eine Reihe von internen Kommandos, die hufig benutzte Aktionen
steueren, wie z.B. Kopieren (cp) oder Auflisten (ls) von Dateien. Durch
Eingabe von 'help' werden alle verfgbaren internen Kommandos aufgelistet.
Als 'externe' Kommandos werden Programme verstanden, die durch den Aufruf
ausgefhrt werden.
Die Shell arbeitet zeilenorientiert, das heit, eine Kommandozeile darf ber
Tastatureingabe nur eine Zeilenbreite betragen, jedoch maximal 128 Zeichen.
Um in der Zeile bequem editieren zu knnen, bietet die shell einige
Tastaturkombinationen:

[BACKSPACE], [CTRL]+H - lscht das Zeichen links vom Cursor
[DELETE]              - lscht das Zeichen unter dem Cursor
[CTRL]+W              - lscht ein Wort
[CTRL]+U              - lscht die ganze Zeile
[CLR/HOME]            - lscht den Bildschirm
[CTRL]+B              - Sprung zum vorigen Wort (backward skip)
[CTRL]+F              - Sprung zum nchsten Wort (forward skip)
[CTRL]+[Pfeil rechts] - Sprung zum Ende der Zeile
[CTRL]+[Pfeil links]  - Sprung zum Anfang der Zeile
[Pfeil hoch]          - vorige Zeile in der Historieliste
[Pfeil runter]        - nchste Zeile in der Historieliste
[HELP]                - expandiert das 1. Wort auf das interne Kommando,
                        das mit der Buchstabenkombination beginnt
                      - expandiert jedes weitere Wort auf den Dateinamen
                        im aktuellen Verzeichnis, das mit der Buchstaben-
                        kombination beginnt
                      - jedes weiter Drcken von HELP sucht das
                        nchstmgliche passende Kommando/Argument
[UNDO]                - zeigt die fr HELP eingegebene Zeichenkette
[INSERT]              - wechselt zwischen berschreibe- und Einfgemodus
[RETURN]              - beendet die Eingabe und fhrt das Kommando aus
[SHIFT]+[ENTER]       - schliet das WSH-Fenster bzw. wechselt in den
                        Graphikmodus

Nach der Ausfhrung des Kommandos gibt die shell einen 'prompt' auf dem
Bildschirm aus und signalisiert damit die Eingabebereitschaft. Die
Zeichenkette, die durch 'prompt' ausgegeben wird, ist auf den aktuellen
Benutzerpfad eingestellt:

Beispiel:  C:\NODESK\USR> _


3  Die Command-Language
=======================

3.1  Aufbau eines Kommandos
---------------------------

Die Kommandos des CLI bestehen aus einer Liste von Zeichenketten oder
auch Worten, die durch Leerzeichen voneinander getrennt sind, wobei das
erste Wort das eigentliche Kommando darstellt. Die brigen Worte (falls
vorhanden) sind Argumente oder Parameter des Kommandos.
Das Kommando

      cat beispiel.txt

besteht aus zwei Worten. Das interne Kommando 'cat' erhlt bei Ausfhrung
das Argument 'beispiel.txt'. 'cat' gibt den Inhalt der Datei 'beipiel.txt'
ber das Standardausgabe-Medium (ist in der Regel wohl der Bildschirm) aus.
Die Ausgabe kann durch die Tastenkombination [CTRL]+C abgebrochen werden.
Dateinamen werden intern immer in Grobuchstaben konvertiert. Anders ist
dies bei Schalterargumenten (flags, s.u.). Der CLI unterscheidet hier
Gro- und Kleinschreibung.
Mehrere Kommandos in einer Zeile werden durch ';' voneinander getrennt und
werden nacheinander abgearbeitet.

Beispiel:  ls -l  >  liste.txt; cat liste.txt; rm liste.txt

Zunchst wird eine ausfhrliche Liste aller Dateinamen im aktuellen
Verzeichnis in die Datei 'liste.txt' geschrieben. Anschlieend wird die
Datei auf den Bildschirm ausgegeben und zum Schlu gelscht.


3.2  Schalterargumente (flags)
------------------------------

Durch optionale Schalterargumente (flags) lt sich die Ausfhrung eines
Kommandos verndern. Ein flag beginnt immer mit einem '-' (Bindestrich),
gefolgt von mindestens einem weiteren Zeichen. GRO- UND KLEINSCHREIBUNG
WERDEN UNTERSCHIEDEN!!!!

Beispiele:  (1)  ls
            (2)  ls -l
            (3)  ls -R

Kommado (1) gibt die Dateinamen im aktuellen Arbeitsverzeichnis aus. Durch
Zusatz des flags '-l' [Kommando (2)] werden zum Dateinamen zustzliche
Informationen wie Dateigre und Erstellungsdatum und -uhrzeit ausgegeben.
Durch die Angabe das flags '-R' [Kommando (3)] werden auch alle im
aktuellen Verzeichnis enthaltene Unterverzeichnisse durchsucht und deren
Inhalt ausgegeben.
Die verschiedenen flags knnen auch kombiniert werden, wobei die
Reihenfolge der flags egal ist:

        ls -l -R
oder    ls -lR
oder    ls -Rl

Das interne Kommandos ls hat noch weitere wichtige und interessante flags.
Andere Kommandos haben keine oder nur wenige flags, wie z.B. 'echo' mit dem
einzigen optionalen flag '-n', das nach Ausgabe einer Zeile das newline
unterdrckt.
Durch Eingabe von 'help' gefolgt von einem internen Kommando kann man sich
die flags fr dieses Kommando anschauen.


3.3  Umlenkung der Ein- und Ausgabe
-----------------------------------

Kommandos, die ihre Eingabe normalerweise von der Tastatur lesen und auf
den Bildschirm schreiben, knnen auch so ausgefhrt werden, da die
Eingabe/Ausgabe ber Dateien abluft.
Das Kommando 'ls' schreibt die gefundenen Dateinamen normalerweise direkt
auf den Bildschirm, Durch Eingabe von

    ls > liste.txt

wird das Ergebnis in die Datei 'liste.txt' geschrieben, nachdem diese Datei
neu angelegt wurde. Fr das Kommando selbst ist es unwesentlich, wohin es
seine Ausgabe schreibt. Die Standard-Ausgabe ist der Bildschirm, die
Umlenkung (redirection) der Standard-Ausgabe in eine Datei (und der
Standard-Eingabe, der Tastatur, von einer Datei) erledigt die shell.
Die Standard-Ein- und Ausgabe knnen in folgender Weise umgelenkt werden:

    < Dateiname     ffnet die Datei 'Dateiname' als Standard-
                    Eingabe. 'Dateiname' mu vorhanden sein!
    > Dateiname     erzeugt die Datei 'Dateiname' und verwendet
                    sie als Ausgabedatei. Ist sie bereits
                    vorhanden, wird sie berschrieben.
    >> Dateiname    die Datei 'Dateiname' wird wie bei '>' als
                    Ausgabedatei benutzt. Die Ausgabe wird an
                    das Ende einer vorhandenen Datei gehngt.
                    Existiert die Datei nicht, wird sie erzeugt,
                    es sei denn, die Variable 'noclobber' ist
                    gesetzt, dann erscheint eine Fehlermeldung.

Anstelle eines Dateinamens kann die Ein-/Ausgabe auch auf einige Standard-
gerte umgelenkt werden:

    PRT:            Druckerschnittstelle
    PRN:            Druckerschnittstelle
    AUX:            serielle Schnittstelle (wie im Kontrollfeld eingestellt)

Die Anweisungsfolge

    cat CLI.TXT > PRN:

wrde also den Inhalt der Datei CLI.TXT auf die Druckerschnittstelle
ausgeben.

Werden Kommandos durch '|' voneinander getrennt, so wird die Ausgabe eines
Kommandos mit der Eingabe des nchsten Kommandos verknpft.
Die Anweisungsfolge

     ls -l | cat -n

leitet die Ausgabe von 'ls -l' an das Kommando 'cat -n' weiter, welches
das Ergebnis auf dem Bildschirm ausgibt und zustzlich nach jeder Zeile
eine Leerzeile einfgt.


3.4  Metazeichen
----------------

Es existiert eine Reihe von Zeichen (wie '>' oder '|'), die eine besondere
Funktion haben. Diese 'Metazeichen' haben eine semantische (inhaltliche)
und syntaktische Bedeutung fr die shell. Allgemein haben fast alle
Zeichen, die nicht Buchstaben oder Ziffern sind, eine spezielle Bedeutung.
Sollen diese Zeichen in einer Zeichenkette als darstellbares Zeichen
ausgegeben werden, so mssen sie bzw. die Zeichenkette 'quotiert' werden,
z.B. wrde

      echo 3 > 2

die Zeichenkette '3' in eine Datei namens '2' schreiben.

      echo '3 > 2'

gbe die Zeichenkette '3 > 2' auf dem Bildschirm aus.

Eine Kommandozeile wird normalerweise dort in Wrter aufgeteilt, wo
Leerzeichen oder Tabulatoren stehen, mit folgenden Ausnahmen:
Die Zeichen  '|'  ';'  '<'  '>'  '('  ')'  fhren ebenfalls zur Aufteilung
in einzelne Wrter. Diese Metazeichen knnen dadurch Teil von Wrtern
werden (d.h ihre Funktion verlieren), da ihnen ein '`' vorangestellt wird.
Zeichenketten, die durch Anfhrungszeichen (' oder ") eingeschlossen sind,
werden als Teile von Wrtern interpretiert. Leerzeichen und die oben
aufgefhrten Metazeichen trennen innerhalb dieser Anfhrungszeichen dann
nicht einzelne Wrter.

Beispiele:  echo 3 > 2    erzeugt 4 Wrter
            echo 3 `> 2   erzeugt 4 Wrter ('>' wird nicht interpretiert)
            echo '3 > 2'  erzeugt 2 Wrter


3.5  Modifier
-------------

Nach der Variablensubstitution und unmittelbar vor der Ausfhrung des
Kommandos wird die Kommandozeile daraufhin geprft, ob am Kommando
oder an den Argumenten noch Modifier stehen. Diese werden zuletzt
bearbeitet.
Es existieren zwei verschiedene Arten von Modifiern:

1. Execution-Modifier
2. Path-Modifier

Modifier dienen dazu, die Art der Kommandoausfhrung (Execution) oder
Pfadnamen (Path) zu verndern (modifizieren).


3.5.1  Execution-Modifier
-------------------------

Diese Modifier betreffen die Ausfhrung eines Kommandos, Execution-Modifier
werden mit einem '@' an den Kommandonamen angehngt.
Folgende Modifier existieren:

Klasse A:

    @W     Die Standard-Ausgabe wird auf das Texteingabefenster
           geleitet, sofern die Variable noWcon nicht gesetzt ist.
           Erfolgt eine Ausgabe, wird das Fenster geffnet bzw.
           zum aktuellen Fenster. Unter Mint wird das Kommando im
           singletask-Modus gestartet.
    @W<n>  Die Standardausgabe wird auf das Textfenster mit
           n = 0 bis 3 umgeleitet, sonst wie @W
    @w     wie oben, nur da ein bereits offenes Text-
    @w<n>  Ausgabefenster nicht zum aktuellen Fenster wird.
           Unter Mint wird ein 'externes' Kommando im Hintergrund
           gestartet, noDesk wartet nicht auf die Beendigung des
           Kommandos.
    @T     Die Textausgabe erfolgt nicht im Fenster
    @t     wie @T, nach Beendigung des Kommandos wird auf einen
           Tastendruck gewartet
    @G     Das Kommando wird im 'Graphikmodus' ausgefhrt.
           Interne Kommandos, die diese Option bieten,  werden im
           Fensterdialog ausgefhrt. Die Textausgabe erfolgt in
           ein Textfenster, wenn verfgbar.

Klasse B (nur fr externe Kommandos):

    @x     vor Ausfhrung wird noDesk ausgelagert, um mehr freien
           Speicher zu Verfgung zu stellen
    @X     wie @x, es wird der Arbeitspfad auf den Ordner gesetzt,
           in dem sich das Programm befindet
    @s, @S noDesk wird nicht ausgelagert, sonst wie @x, @X
    @c, @C noDesk entscheidet anhand der Programmgre, ob ausgelagert
           werden soll, sonst wie @x, @X bzw. @s, @S
    @n, @N noDesk wird nicht ausgelagert, es werden keine Fenster
           geschlossen, sonst wie @x, @X

Modifier der Klasse A und der Klasse B knnen zusammen angegeben werden,
aber jeweils nur einer der Klasse A und einer der Klasse B, wobei die
A-Option vor der B-Option stehen mu:

    test@TX

Die Klasse A - Modifier W1-W3 haben nur Sinn in Verbindung mit den Klasse
B - Modifiers N bzw n! Wenn Modifier nicht angegeben werden, gelten die
entsprechenden Einstellungen der NDQ-Datei!


3.5.2  Path-Modifier
--------------------

Durch Modifikationen an Pfadangaben ist es mglich, nur den bentigten Teil
aus dem Pfadnamen zu extrahieren. Die Modifier folgen unmittelbar auf ein
Argument und werden durch ':' eingeleitet. Eine Modifikationen innerhalb
von Zeichenketten, die durch " eingeschlossen sind, findet nicht statt.
Steht das ':' im ersten Wort (eigentliches Kommando) oder folgt auf ein ':'
ein '\', dann erfolgt keine Modifikation. Stehen mehrere jeweils durch ':'
eingeleitete Modifier hintereinander, wird von links nach rechts das
Erebnis jeweils erneut modifiziert. Variablen, die Doppelpunkte enthalten
(z.B. shareend) mssen bei Variablen-Substitution in " gesetzt werden.
Folgende Modifier stehen zur Verfgung:

    :h       Pfadangabe ohne Dateinamen (head)
    :r       Pfad und Dateinamen ohne Dateiextension (root)
    :e       nur Dateiextension (extension)
    :t       nur Dateinamen (tail)
    :n       wie -t, bei Ordnernamen '\' am Ende
    :d       Laufwerksangabe (drive)
    :l<n>    Zeile in Datei n = Zeilennummer
    :w<n>    Wort in Zeile  n = Wortnummer
    :D       Dieser Modifier ersetzt den Dateinamen durch
             deren Erstellungsdatum im Format:<Djjmmddhhmmss>

Hinweis:
Der Modifier >:D< ist besonders sinnvoll, um Abhngigkeiten von Dateien zu
testen. So lt sich mittels dieses Modifiers ein Makefile fr die TURBO-C
Kommandozeilenversion entwickeln!


3.6  Ausgabe von Sonderzeichen
------------------------------

Wird einem beliebigen Zeichen ein '`' vorangestellt, so wird es als
normales Zeichen ausgegeben und nicht mehr interpretiert. Auf diese Weise
knnen z.B. Metazeichen als druckbare Zeichen ausgegeben werden. Die
Ausgabe nicht-druckbarer Zeichen ist ebenfalls mglich.


    `"     ->   "          Anfhrungszeichen
    `?     ->   ?          Fragezeichen
    `\     ->   \          Backslash (umgek. Schrgstrich)
    `a     ->   BEL        Bell (Systemglocke)
    `b     ->   BS         Backspace
    `f     ->   FF         Formfeed (Seitenvorschub)
    `n     ->   LF         Linefeed (Newline)
    `r     ->   CR         Carriage return (Wagenrcklauf)
    `t     ->   HT         Tabulator (horizontal)
    `v     ->   VT         Tabulator (vertikal)
    `DDD   -> oktal        DDD = 1 bis 3 Oktalziffen
    `xHH   -> hexadezimal  HH = 1 bis 2 Hexadezimalziffern


3.7  Variablen
--------------

Der CLI verwaltet eine Reihe von Variablen. Der Inhalt von Variablen kann
mit den Kommandos 'set' angezeigt oder verndert, mit 'unset' die Variable
gelscht werden. Variablennamen drfen maximal 12 Zeichen lang sein, sie
mssen mit einem Buchstaben beginnen und drfen ansonsten nur Ziffern und
Buchstaben enthalten. Der Inhalt von Variablen wird intern immer als
Zeichenkette verwaltet. Einige Kommandos (z.B. eval) interpretieren den
Inhalt von Variablen numerisch, eine Variable ohne Inhalt wird in diesem
Fall als '0' interpretiert. Enthlt eine Variable mehrere Worte, so wird
bei numerischer interpretation immer nur das erste Wort interpretiert.
Einige Variablen werden von noDesk bereitgestellt (sogenannte 'interne'
Variablen). Interne Variablen haben unterschiedliche Eigenschaften:
Solche Variablen, die die Hardwareeigenschaften des System beschreiben,
sind nur lesbar und nicht lsch- oder vernderbar. Andere interne
Variablen beinhalten sehr wichtige Informationen fr den noDesk und werden
whrend des Ladens der Desktopscripte initialisiert (Eine komplette
Liste der internen Variablen und ihrer Bedeutung steht am Ende dieser
Datei!).
Bei anderen Variablen (externen) interessiert noDesk nur, ob diese gesetzt
(definiert) sind oder nicht, der Inhalt dieser Variablen ist unwichtig.
Der Inhalt von Variablen kann mit den Kommandos 'set' angezeigt oder
verndert, mit 'unset' die Variable gelscht werden.
Beispiele:

    set                 gibt alle 'sichtbaren' Variablen aus
    set -i              gibt interne und gesetzte Variablen aus
    set -ia             zeigt alle internen Variablen, auch die
                        nicht gesetzen

    set i               setzt die Variable i
    set i = hallo       setzt die Variable i auf den Wert 'hallo'
    set i = ( a b $i )  setzt i auf die Wortliste 'a b hallo', eine
                        Wortliste mu in runde Klammern gerahmt sein

Um das Ergebnis einer Berechnung einer Variablen zuzuweisen, ist folgende
Schreibweise notwendig:

    set <Variablenname> @ <Berechnung>

Beispiele:

    set i @ 1+2*3       setzt i auf den Wert '7', zuerst wird die
                        Berechnung ausgefhrt, dann das Ergebnis
                        zugewiesen

    set i @ -wd test.c  zhlt alle Wrter in test.c und weist das
                        Ergebnis der Variablen i zu


3.8  Bedingte Anweisungen
-------------------------

Bedingungen sind fr den CLI Berechnungen, deren Ergebnis nur wahr oder
falsch sein kann. Eine Bedingung ist erfllt (oder wahr), wenn das Ergebnis
ungleich '0' (Null) ist, sonst ist sie nicht erfllt oder falsch. Bei der
berprfung einer Bedingung (z.B. im 'if'-Kommando) wird nur auf die
fhrenden Zahlen im Ergebnis geachtet, es werden immer Wrter als Zahlen
interpretiert. So knnen auch Variableninhalte als Bedingung interpretiert
werden. Die Syntax von Bedingungen (Berechnungen) und die Prioritt der
Operatoren entspricht der Schreibweise in 'C'. Innerhalb von Bedingungen
drfen keine Kommandos stehen (im Gegensatz zum 'csh' in Unix). Zustzlich
zu rein algebraischen und logischen Operatoren existieren solche, die
Zeichenketten miteinander vergleichen oder Dateiattribute interpretieren.
Die Klammerung '(...)' von Ausdrcken ist erlaubt. Sogenannte 'unre'
Operatoren stehen vor einem Ausdruck, 'binre' zwischen zwei Ausdrcken.
Im Folgenden werden alle verfgbaren Operatoren beschrieben:

  Schreibweise  Beispiel   Bescheibung

  ||, .or.      a || b        logisches 'OR'
  .and.         a .and. b     logisches 'AND'
  |, .bor.      a | b         bitweises 'OR'
  ^, .xor.      a ^ b         bitweises 'EXOR'
  .band.        a .band. b    bitweises 'AND'
  ==, .eq.      a == b        Prfung auf numerische Gleichheit
  !=, .ne.      a != b        Prfung auf numerische Ungleichheit
  =~            strA =~ strB  Prfung auf Gleichheit in Strings
  !~            strA !~ strB  Prfung auf Ungleichheit in Strings
  <=, .le.      a <= b        numerisches kleiner oder gleich
  >=, .ge.      a >= b        numerisches grer oder gleich
  <, .lt.       a < b         numerisches kleiner
  >, .gt.       a > b         numerisches grer
  <<, .shl.     a << b        bit-Shift links um b Einheiten
  >>, .shr.     a >> b        bit-Shift rechts um b Einheiten
  +, -, *, /                  Grundrechenarten
  %, .mod.      a % b         Rest der Division a / b (modulo)
  !, .not.      ! a           logisches 'NOT'
  ~, .bnot.     ~ a           binres 'NOT'
  -r           -r a           Datei a ist nur lesbar (readonly)
  -w           -w a           Datei a ist les- und schreibbar
  -x           -x a           Datei a ist ein ausfhrbares Programm
  -e           -e a           Datei a ist vorhanden
  -o           -o a           Datei a gehrt Benutzer (z.Zt. dummy)
  -z           -z a           die Dateilnge von a ist '0'
  -d           -d a           Datei a ist ein Ordner
  -wd          -wd a          Anzahl der Wrter in Datei a
  -ln          -ln a          Anzahl der Zeilen in Datei a


3.9  Aliases
-------------

Die shell verwaltet eine Liste mit aliases, die durch die Kommandos 'alias'
und 'unalias' erzeugt, angezeigt oder verndert werden knnen. Aliasnamen
drfen vorhandene Kommandonamen sein. Mit einem alias kann z.B. fr eine
ganze Kommandosequenz eine 'Name' definiert werden (spart Tipparbeit!):

      1  alias ll 'ls -l' ersetzt ll durch ls -l
      2  ll tmp           -> ls -l tmp

      3  alias            gibt alle aliases als Liste aus
      4  unalias ll       lscht das alias 'll' aus der Liste


3.10  History - Liste
---------------------

Die shell verwaltet eine History-Liste, in welcher sie zuvor eingegebene
Kommandozeilen aufbewahrt. Dies ist ntzlich, um Kommandos zu wiederholen
oder kleine Schreibfehler in Kommandos zu korrigieren. Die Anzahl der
Eintrge wird durch die Variable 'history' bestimmt. Sie kann durch

      echo $history

angezeigt werden und durch

      set history = n  (n = Zahl zwischen 1 und 999)

verndert werden. Die letzte Kommandozeile wird immer gespeichert. Es
werden normalerweise nur Kommandos, die direkt eingegeben werden in die
Liste aufgenommen.

Durch Eingabe von

      history

wird die History-Liste ausgegeben, die z.B. so aussehen knnte:

      9  ls -l
      10 cat otto
      11 cp liste.txt liste.bak
      12 diff liste.txt liste.new

Die Kommandos erscheinen mit ihrer Ereignisnummer (Event-Nummer). Diese
Nummer kann fr die History-Substitution (siehe unten) verwendet werden.


4  Parsing und Substitution
===========================

Nachdem eine Kommandozeile vom CLI gelesen wurde, wird die Zeile, wenn
durch ';' oder '|' getrennt, in Einzelkommandos unterteilt. Diese Kommandos
werden nun bersetzt, d.h. in eine ausfhrbare Form gebracht. Dabei werden
bestimmte Zeichensequenzen ausgetauscht (substituiert), so wird eine
Variable z.B. durch ihren Inhalt ersetzt.
Im folgenden wird beschrieben, in welcher Reihenfolge der CLI bei der
bersetzung der Kommandozeile in eine ausfhrbare Form vorgeht.


4.1  History-Substitution
-------------------------

Es ist mglich, zuvor ausgefhrte Kommandos und selbst Teile von Kommandos
in ein neues Kommando zu integrieren. Dazu bedient man sich der History-
Substitution. Sie beginnt immer mit einem '!' und kann mehrfach und an
beliebiger Position in der Eingabezeile vorkommen. Steht hinter dem '!' ein
Leerzeichen, Tabulator, '=' oder '(' wird keine Substitution durchgefhrt.
History-Substitutionen beginnen auch, wenn die Eingabezeile mit einem '^'
beginnt. Jede Eingabezeile, die History-Substitutionen enthlt, wird nach
der Substitution auf dem Bildschirm ausgegeben.

Die Beispiele in den folgenden Abschnitten beziehen sich auf den folgenden
Ausschnitt aus einer history-list:

      9  ls -l
      10 cat otto
      11 cp liste.txt liste.bak
      12 diff liste.txt liste.new


4.1.1  Zeilensubstitution
-------------------------

Um eine komplette Zeile zu substituieren, stehen folgende Mglichkeiten zur
Verfgung:

      !n      Substituiert Eventzeile n
      !-n     Substituiert die Zeile mit der Nummer 
              [aktuelle Eventnummer]-n
      !!      Substituiert die komplette letzte Zeile und ist
              gleichbedeutend mit einer Wiederholung des
              letzten Kommandos.
      !t      fr t kann gibt man die Anfangsbuchstaben einer
              Kommandozeile ein, die history-list wird dann
              nach einer Kommandozeile mit diesen
              Anfangsbuchstaben abgesucht, die Suche beginnt
              beim neuesten Kommando
      !?t?    der Text kann an beliebiger Position mit dem
              Wildcard '?' versehen werden, es wird dann
              nach der ersten 'passenden' Kommandozeile
              gesucht

Beispiele:
      !11      -> cp liste.txt liste.bak
      !-2      -> cp liste.txt liste.bak

      !d       -> diff liste.txt liste.new
      !di      -> diff liste.txt liste.new

      !?ot?    -> cat otto

      !!       -> diff liste.txt liste.new


4.1.2  Wortsubstitution
-----------------------

Um einzelne Wrter aus einer Event-Zeile zu extrahieren, knnen wir nach
der Zeilenspezifikation ein ':' setzen und dann eine (Zahlen-)Angabe fr
das gewnschte Wort. Das erste Wort einer Zeile (der Kommandoname) hat die
Nummer 0, das zweite Wort (also das erste Argument) die Nummer 1 usw.
Mit folgenden Angaben kann ein Wort aus einer Zeile extrahiert werden:

      :0        erstes Wort (Kommandoname)
      :n        n-tes Argument
      :^        erstes Argument
      :$        letztes Argument
      :%?...?   Wort, welches die Zeichen zwischen den
                Fragezeichen enthlt
      :x-y      x-tes bis y-tes Wort
      :-y       entspricht 0-y
      :*        entspricht 1-y
      :x*       entspricht x-$
      :x-       entspricht x-'vorletztes Argument'

Beispiele:
      mv !12:*             -> mv liste.txt liste.new
      cp !12:%?te.n? !10:$ -> cp liste.new otto
      rm !11:2             -> rm liste.bak
      !10:0 !12:2          -> cat liste.new

Ist das erste Zeichen einer Kommandozeile ein '^', so wird die
Zeichenfolge, die zwischen diesem Zeichen und einem weiteren '^' steht,
durch die danach folgende Zeichenfolge in der vorigen Zeile ersetzt. Damit
kann man Schreibfehler leicht verbessern.

      cb otto.1 otto.bak    (vorige Zeile)

      ^cb^cp        -> cp otto.1 otto.bak


4.2  Alias-Substitution
-----------------------

Das erste Wort jedes Einzelkommandos einer Kommandozeile wird daraufhin
untersucht, ob es ein alias ist. Wenn dem so ist, so wird das alias durch
den Text, fr den es steht, ersetzt und das Kommando erneut History-
substituiert, so, als wre die eingegebene Zeile die vorige Eingabezeile.
Dies hat den Vorteil, da ein alias History-Substitution enthalten darf
und es damit mglich ist, Argumente des Einzelkommandos zu nehmen und an
eine beliebige Stelle im Ersetzungstext zu setzen. Die substituierte Zeile
ersetzt das Kommando und die Argumente. Wird keine History-Substitution im
aliastext verwendet, so bleiben die Argumente unverndert. Wird im
aliastext wiederum ein alias verwendet, so wird die alias-Substitution
erneut durchgefhrt. Ist das erste Wort der substituierten Zeile dasselbe
wie in der alten, so wird eine erneute Substitution verhindert, um eine
endlose Ersetzung zu verhindern. Andere 'Endlosschleifen' erzeugen eine
Fehlermeldung.

Beispiel:  alias lookup 'grep !^ test.c'

           ersetzt lookup durch grep und das 1. Argument der
           eingegebenen Zeile. Die Zeichenkette steht in '...',
           um die History-Substitution bei Eingabe zu verhindern.

           lookup cli.c      -> grep cli.c test.c


4.3  Parsing und Makrosubstitution
----------------------------------

Nach der alias-Substitution wird jedes Einzelkommando parsiert, d.h. auf
korrekte Schreibweise hin geprft und in eine interne Form gebracht.
Gleichzeitig werden Makros substituiert. Makros knnen ausschlielich in
der Objektdefinitionsdatei (.NDQ) verwendet werden. Ein Einsatz in der
shell oder in Scripten ist nicht mglich. Mehr zu Objektdefinitionsdateien
und Makros -> OBJECTS.TXT.


4.4  Variablensubstitution
--------------------------

Nachdem die Kommandozeile parsiert wurde, findet die Variablensubstitution
statt. Damit eine Variable substituiert wird, mu ihr ein '$' vorangestellt
werden (bis auf zwei Ausnahmen: '~' und '~~') . In Zeichenketten, die in
>'< eingeschlossen sind, findet ebenfalls Variablensubstitution statt.
Besteht der Inhalt einer Variablen aus mehreren Wrtern, so werden diese
als einzelne Argumente substituiert, innerhalb von >"< nur als Sequenz
einer Zeichenkette.
Es existieren mehrere Varianten der Variablenubstitution:

      $Variable
oder  ${Variable}          wird ersetzt durch den Wert der Variablen
                           '{}' trennt eindeutig den Variablennamen
                           von  einer nachfolgenden Zeichenkette

      $Variable[Bereich]
oder  ${Variable[Bereich]} wird benutzt, um nur einzelne Wrter des
                           Variableninhaltes zu substituieren. Enthlt
                           die Variable nur ein Wort, so wird ein
                           Buchstabenbereich substituiert.  Der Bereich
                           hat die Form:  x, x-y, x- oder -y,
                           wobei x und y Bereichszahlen sind, eine
                           Variablensubstitution findet hier nicht
                           statt. >*< selektiert alle Wrter, das
                           erste Wort hat die Nummer 1

      $#Variable
oder  ${#Variable}         Anzahl der Wrter einer Variablen

      $0                   Scriptname, wenn in einem Script benutzt,
                           sonst Fehlermeldung

      $zahl
oder  ${zahl}              -> $argv[zahl]
      $*                   -> $argv[*]
                           argv enthlt die Argumente, die einem
                           Script bergeben wurden

      $?Variable
oder  ${?Variable}         substituiert '1', wenn die Variable
                           gesetzt (vorhanden) ist, sonst '0'

      $$                   substituiert die Schachtelungstiefe von
                           Scripten als Zahl

      $<                   forciert die Eingabe einer Zeile ber die
                           Tastatur, diese wird als Wert eingefgt.

      ~                    Benutzerverzeichnis, entspricht $HOME

      ~~                   Verzeichnis von noDesk, entspricht $NDHOME


Nach der Variablensubstitution und unmittelbar vor der Ausfhrung des
Kommandos wird die Kommandozeile daraufhin geprft, ob am Kommando oder an
den Argumenten noch Modifier stehen. Diese werden zuletzt bearbeitet.


4.5  Verhinderung von Substitutionen
------------------------------------

Die Einrahmung von Zeichenketten in der Form '...' oder "..." dient dazu,
alle bzw. einen Teil der Substitutionen in diesem Bereich zu verhindern.
Zeichenketten, die durch >'< eingeschlossen sind, sind vor einer weiteren
Interpretation durch den CLI geschtzt - es findet also in diesem Bereich
keine Substitution statt. Zeichenketten, die durch >"< eingeschlossen sind,
werden nur teilweise substituiert.


4.6  Ausfhrung eines Kommandos
-------------------------------

Sind alle Substitutionen erfolgt, wird das Kommando ausgefhrt; sei es ein
'internes', ein 'externes' (also ein Programm) oder ein Script. Nach
Ausfhrung des Kommandos wird als Beendigungsstatus eine Zahlenangabe in
die Variable 'status' geschrieben und kann z.B. mit

      echo $status

direkt im Anschlu an das letzte Kommando abgefragt werden.
Definitionsgem wird bei fehlerfreier Ausfhrung eines Kommandos eine '0'
zurckgeliefert. Werte ungleich '0' zeigen meist einen Fehler an.



5  Scripte
==========

Scripte unter noDesk sind Textdateien (*.NDS), die Kommandozeilen
enthalten. Zustzlich zu der direkten Kommandoeingabe bietet das Schreiben
von Scripten die Mglichkeit, komplexe Dateioperationen zu automatisieren.
Hierfr stehen in Scripten komfortable Programmiertechniken, wie bedingte
Ausfhrung, Sprnge, Sprungmarken und Programmschleifen, zur Verfgung.
Mehrere Scripte knnen auch ineinander geschachtelt werden.
noDesk selbst verwendet beim Programmstart Scripte und schreibt beim
Auslagern ein temporres Script mit allen wichtigen Desktopinformationen.
Diese Datei wird nach Rckkehr zum noDesk gelesen und anschlieend
gelscht. Der Aufruf eines Scriptes ist der gleiche, wie der eines
Kommandos, bei Namensgleichheit mit anderen Kommandos oder Programmnamen
empfiehlt sich der Zusatz der Endung .NDS .
Einem Script knnen Argumente mitgegeben werden. Vor Aufruf des Scriptes
wird eine neue (lokale) Variable 'argv' erzeugt, die eine Liste der
bergebenen Argumente enthlt. Im Script kann z.B. auf das 1. Argument mit
$1 oder $argv[1] zugegriffen werden. Die Anzahl der bergebenen Argumente
erhlt man durch $#argv.
Werden in einem Script neue Variablen definiert, so existieren diese nur
solange, wie die Bearbeitung des Scriptes dauert. Ausnahme bildet der Aufruf
eines Scriptes durch

      source <Scriptname> ...

Nur in diesem Falle werden alle im Script definierten Variablen global
definiert und sind auch nach Beendigung des Scriptes verfgbar. Ein
Spezialfall ist folgender Aufruf:

      source -h <Scriptname>

In diesem Falle werden alle im Script enthaltenen Zeilen in die
Historyliste kopiert, das Script selbst wird aber nicht ausgefhrt.

Alle in einem Script definierten Variablen sind bei einem Scriptaufruf in
diesem Script ebenfalls verfgbar, allerdings nur lesbar. Die Definition
einer Variablen in einer tieferen Script-Ebene mit dem gleichen Namen wie
eine Variable in einer hheren (bergeordneten) Script-Ebene fhrt zur
Neudefinition einer lokalen Variablen fr die untergeordnete Ebene. Der
Inhalt der Variablen der bergeordneten Script-Ebene kann nicht verndert
werden. Nach Beendigung des untergeordneten Scriptes werden die lokal
definierten Variablen wieder gelscht. Die Verschachtelungstiefe der
Scriptebenen kann durch

      echo  $$

abgefragt werden.
Beginnt eine Zeile innerhalb eines Scriptes mit einem '#', so wird der Rest
dieser Zeile vom CLI als Kommentar gewertet und ignoriert.
Wird whrend der Bearbeitung des Scriptes ein Kommando mit einem Status
ungleich '0' beendet (es ist also aller Wahrscheinlichkeit nach ein Fehler
aufgetreten), so wird die Bearbeitung des Scriptes abgebrochen und der letzte
(Fehler-)Status zurckgeliefert. Der Abbruch eines Scriptes im Fehlerfall
kann durch Setzen der internen Variablen 'ignoreerr' verhindert werden:

      set ignoreerr

Das Script wird in diesem Fall nur noch bei fatalen Fehlern abgebrochen.

In Scripten sind Kommandos mglich, die definitionsgem mehrere Zeilen
umfassen. Im Gegensatz dazu sind im Eingabefenster nur einzeilige Kommandos
erlaubt.


6  Die WCON-Fenster
===================

noDesk bietet die Mglichkeit, die Standardeingabe und -ausgabe (s.o.) auf
Fenster umzulenken. Diese Option gilt zunchst nur fr die Normalversion
und das Mint-System, unter Mag!X ist nur das WSH-Fenster (Kommandoeingabe)
verfgbar, um dort interne Kommandos auszufhren.
Die Anzahl der Textfenster, auf die die Ein- und Ausgabe erfolgen soll,
wird im Startskript DESK.NDS im Kommando 'newdesk' definiert, indem jedes
einzelne Fenster am Ende des Befehls beschrieben wird:

  newdesk  ..... ..... ..... STD STD,100x200 STD,80x30 STD,80x5

In diesem Beispiel werden 4 Fenster definiert. Es knnen maximal 10
WCON-Fenster definiert werden (WCON0 - WCON9). Fr jedes einzelne Fenster
mu die Zeichenkette 'STD' (= Standard) eingetragen werden, optional kann
die Zeilenlnge und Zeilenanzahl definiert werden. Sie mu durch ein ','
eingeleitet werden und dann mssen zwei Zahlenangaben, durch 'x' getrennt
folgen. Die erste Zahl definiert die Zeilenbreite des Fnsters, die Zweite
die Zeilenanzahl. Werden keine Werte angegeben, wird die Zeilenbreite auf
80 Zeichen, die Zeilenanzahl auf 25 Zeilen gesetzt. Diese Angaben bleiben
aktiv, solange noDesk arbeitet und knnen nicht gendert werden.

Das erste Fenster (WCON0) ist immer fr die shell reserviert und heit
WSH-Fenster.

Die Ausgabe ber ein WCON-Fenster wird ber die interne Variable 'noWcon'
gesteuert. Solange sie nicht gesetzt ist, sind die WCON-Fenster aktiv; wird
sie gesetzt, so schaltet noDesk bei Standardausgabe auf den Textbildschirm
um. Ist kein Fenster ber 'newdesk' definiert, so ist 'noWcon' gesetzt und
kann nicht verndert werden, die Standardein- und ausgabe erfolgt auf dem
Textbildschirm. Einige Programme, die ihre eigene Textausgabe haben,
arbeiten nicht mit den WCON-Fenstern zusammen. In diesem Fall sollte ber
das Popupmen des Desktops die Ausgabe auf den Textbildschirm eingestellt
werden oder beim Programmaufruf der Modifier '@T' bzw. '@t' an den
Programmnamen gehngt werden.

Beispiel:  TLDU.TOS@T

Die Ausgabe eines Kommandos erfolgt normalerweise immer im WSH-Fenster. Die
Ausgabe auf andere WCON-Fenster gelingt mit den Modifizierern '@Wn'. Mchte
man ein Textprogramm z.B. im 2. WCON-Fenster (WCON2) laufen lassen, so mu
man direkt an den Programmnamen den Modifier '@W2' oder '@w2' hngen:

Beispiel:  LHARC@W2

Im Multitaskingbetrieb (unter MINT, MTOS) ist es auf diese Weise mglich,
ein Programm im Hintergrund zu starten, d.h. noDesk wartet nicht auf die
Beendigung des Programmes sondern teilt dem Programm nur ein Fenster zu.
Die Ausgabe erfolgt dann in regelmigen Abstnden.

Beispiel:  LHARC@w2 startet das Programm unter MTOS/MINT im Hintergrund
                    im WCON2-Fenster

Man sollte sich davor hten, ein Programm, das im Hintergrund gestartet
wurde, im WSH-Fenster ausgeben zu lassen, da in diesem Falle eine
Kommandoeingabe erst dann wieder mglich ist, wenn das Programm beendet
wurde.


6.1  ffnen eines WCON-Fensters
-------------------------------

Im Normalfall wird ein WCON-Fenster geffnet, sobald ein Eingabe oder
Ausgabe in dieses Fenster stattfindet. Erfolgt eine Eingabe, wird das
Fenster zum aktuellen Fenster, d.h. es wird 'getoppt'. Vom WSH-Fenster hat
man ber das Kommando 'wcon' die Mglichkeit, ein Fenster explizit zu
ffnen:

    wcon -3  ffnet das WCON3-Fenster

Der erste optionale Parameter bestimmt die Fensternummer. Der aktuelle
Inhalt eines Fensters bleibt erhalten.


6.2  Programmunterbrechung in einem WCON-Fenster
------------------------------------------------

Durch Eingabe der Tastenkombination '[CTRL]+C' kann in der Regel jedes
externe Programm und interne Kommando abgebrochen werden. Um ein laufendes
externes Programm zu unterbrechen klickt man einfach mit einer Maustaste.
Der Programmname in der Titelzeile des WCON-Fensters wird durch '<...>'
eingerahmt. Nun ist es mglich, das Fenster zu verschieben, dessen Gre zu
verndern und sich den gesamten Inhalt des Fensters anzuschauen. Klickt man
mit der Maus auf den linken oberen Fensterknopf (Closerbutton) so wird nach
Rckfrage die Ausfhrung des Programms abgebrochen. Ebenso ist an dieser
Stelle das Drcken von '[CTRL]-C' mglich. Zum Fortsetzen des
Progammablaufs klickt man mit der Maus auf den Ausgabebereich des Fensters.
Eine Programmunterbrechung durch '[CTRL]-S' ist bei WCON-Fenstern NICHT
mglich!


6.3  VT52-Funktionalitt eines WCON-Fensters
--------------------------------------------

Die Ausgabe auf ein WCON-Fenster durchluft einen VT52-Emulator. Enhlt die
Ausgabe VT52-Steuerbefehle, so werden diese interpretiert. So ist es z.B.
mglich, Texte, die VT52-Steuerbefehle enthalten, mit allen Textattributen
auszugeben. Weiterhin versteht jedes WCON-Fenster einem minimalen VT100-
Steuerbefehlssatz, allerdings nur die Befehle, die sich auf die
Textattribute und Textfarben beziehen.

ber die Tastatur knnen die verfgbaren Steuerbefehle auch direkt
eingegeben werden. Die Tastenkombination 'ALT-ESC' schaltet in den
Steuerbefehlsmodus. Die Eingabe von 'ESC' wird nun als Steuerzeichen
interpretiert (hex 0x1B). Unbekannte Steuerbefehle werden ignoriert. Dieser
Modus wird durch erneutes Drcken von 'ALT-ESC' wieder verlassen.


6.4  Primitive Terminal-Fenster (WAUX und WTALK)
------------------------------------------------

Durch Setzen der internen Variablen 'wauxwin' wird ein WCON-Fenster zu
einem Terminal-Fenster. Jede Eingabe von der seriellen Schnittstelle geht
auf das WAUX-Fenster, jede Eingabe im Fenster wird auf die serielle Ausgabe
geleitet.

    set wauxwin       setzt das Terminalfenster WAUX auf WCON1
    set wauxwin = 3   setzt WAUX auf WCON3
    unset wauxwin     lscht die Terminalfunktion
    waux              ffnet das WAUX-Fenster

Durch Setzen der Variablen 'wtalkwin' wird ein WTALK-Fenster definiert.
Jede Eingabe in dieses Fenster erscheint im Fenster und wird auf die
serielle Ausgabe geleitet. Bei Kommunikation mit einem entfernten Computer
per Tastatur sieht man also das, was man schreibt, auch auf dem Bildschirm.


    set wtalkwin      setzt das Talkfenster WTALK auf WCON1
    set wtalkwin = 3  setzt WTALK auf WCON3
    unset wtalkwin    lscht die Talkfunktion
    wtalk             ffnet das WTALK-Fenster

Es ist nicht mglich, das WTALK-Fenster zu ffnen oder die Variable
'wtalkwin' zu setzen, ohne da ein WAUX-Fenster existiert.

Die Variablen 'wauxicrnl' und 'wauxocrnl' definieren die Behandlung der
RETURN-Taste (bzw. des Wagenrcklaufs (cr)). Ist 'wauxicrnl' gesetzt, so
wird jeder Wagenrcklauf (cr), der ber die serielle Eingabe kommt in einen
Zeilenvorschub (nl) und Wagenrcklauf (cr) umgesetzt. Ist 'wauxocrnl'
gesetzt, so wird bei Drcken der RETURN-Taste (cr) ein Wagenrcklauf (cr)
und Zeilenvorschub (nl) gesendet.

Das WAUX-Fenster stellt die primitivste Form eines Terminals dar und dient
lediglich dem direkten Ansteuern der seriellen Schnittstelle ber die
Tastatur. Die Einstellungen der seriellen Schnittstelle (Baudrate usw.)
wird anderen Progammen berlassen.


7  Interne Kommandos
====================

noDesk besitzt eine groe Anzahl von internen Kommandos. Ein Teil dieser
Kommandos entspricht den unter anderen Betriebssystemen bekannten Kommandos
zum Anzeigen und Manipulieren von Dateien, zur Verwaltung von Variablen
u.a. Ein Groteil der Kommandos dient der Manipulation und Gestaltung von
noDesk- eigenen Fenstern und anderen Objekten, sowie deren Interaktion.
Viele dieser Kommandos werden in der Objektdefinitionsdatei verwendet, um
einen individuellen Desktop zu ermglichen. Jede Aktion auf dem Desktop,
jede Bewegung einer Datei in einen Ordner oder woanders hin, jedes Klicken,
Doppelklicken, jede Tastatureingabe beruht auf einer sinnvollen
Zusammenstellung von internen Kommandos. Einerseits kann man durch ndern
der Objektdefinitionsdatei seinen individuellen Desktop schreiben,
andererseits bentigt man viele der beschriebenen Kommandos nur dort und
wird sie beim normalen Arbeiten kaum verwenden.


7.1  Graphikmodus und Textmodus
-------------------------------

Viele der beschriebenen Kommandos liegen in zwei verschiedenen
Darstellungsformen vor: Im 'Graphikmodus' erscheint bei Ausfhrung des
Kommandos ein benutzergefhrter Dialog und die Paramter werden in den
Dialogfenstern festgelegt; im 'Textmodus' erfolgt die Eingabe der Parameter
ber die Kommandozeile in der shell. Die Darstellungsform ist davon
abhngig, ob das WSH-Fenster offen ist, bzw. die shell im Textbildschirm
luft oder nicht. Im ersten Fall wird die Eingabe (und in der Regel die
Ausgabe) im Textfenster oder -bildschirm vorgenommen. Andernfalls wird das
Kommando als Dialog ausgefhrt.
Zu diesen Kommandos zhlt z.B.

    cp

Andere Kommandos sind fr den Text- und Graphikmodus durch unterschiedliche
Kommandonamen definiert. Das liegt vor allem an den unterschiedlichen
Parametern in beiden Modi aber auch an einer teilweise unterschiedlichen
Funktionalitt. Zum Anzeigen von Dateinamen dient im Textmodus das Kommando

    ls

Im Graphikmodus arbeitet man mit dem Kommando

    wls

hnlich verhlt es sich mit den Kommandos 'echo' und 'gecho'.


7.2  Ausgabe von Fehlermeldungen
--------------------------------

Tritt bei der Kommandoausfhrung ein Fehler auf, so wird die Fehlermeldung
in einem Dialogfenster ausgegeben, sofern kein WSH-Fenster offen ist oder
der Textbildschirm aktiv ist. In diesen Flllen wird die Fehlermeldung ber
die Standardausgabe geschrieben.


8  Fensternummern
=================

Jedem geffneten Fenster im noDesk wird automatisch eine eindeutige Nummer
zugeordnet. Diese erscheint im Kopfbalken des Fensters, und zwar
mit einem abschlieenden Doppelpunkt (':'). Somit ist es mglich, z.B.
Kopieroperationen von einem Fenster in ein anderes ber die Fensternummern
zu steuern. Hat man z.B. in einem Fenster mit der Nummer '1:' einige
Dateien selektiert, um sie in den Pfad des Fensters mit der Nummer '3:' zu
kopieren, so drckt man Cntrl-K (fr Kopieren) und gibt dann als Zielpfad
in der erscheinenden Dialogbox einfach '3:' - also nur die Fensternummer -
an. Die Expandierung der Nummern auf die entsprechenden Pfade bernimmt
noDesk dann von selbst.


Anhang
======

A1  bersicht ber die internen Variablen
-----------------------------------------

Im folgenden wird jede interne Variable genauer beschrieben.
Jede interne Variable hat zustzlich zu ihrem Inhalt noch
individuelle Eigenschaften, so werden einige bei Eingabe des 'set'-
Kommandos mit angezeigt, andere nicht. Einige werden beim Auslagern
von noDesk in einer temporren Datei mit abgespeichert und stehen
nach Rckkehr wieder zur Verfgung. Viele der internen Variablen
werden beim 'Desktop Speichern' in der DESK.NDS gesichert.

Die folgenden Abkrzungen beschreiben die individuellen Attribute
einer internen Variable:

    v   (visible)   wird beim 'set'- Kommando mitangezeigt
    r   (readonly)  nur lesbar, nicht lschbar
    n   (nounset)   nicht lschbar
    d   (d_save)    wird beim Sichern des Desktops gespeichert
    x   (x_save)    wird beim Auslagern von noDesk gespeichert
    i   (index)     primr indizierte Variable
    s   (state)     ist bei Programmstart gesetzt


Name       |Attribute| Bedeutung
-----------+---------+-----------------------------------------------
NDHOME     | vrns    | HOME-Pfad von noDesk (entspricht ~~)
           |         | (z.B. 'C:\NODESK')
HOME       | vrns    | HOME-Pfad des Benuters (entspricht '~')
           |         | (z.B. 'G:\USR\ANDI')
PATH       | vnx     | Suchpfade, durch ';' getrennt, die noDesk vor
           |         | Starten eines Programms ohne Pfadangabe
           |         | durchsucht
TEMPDIR    | vx      | Ordner, in dem noDesk Temporrdateien ablegt
TEMPFILE   | vnxs    | Name der Temporrdatei, die beim Auslagern
           |         | erzeugt wird
SYSDIR     | vnxs    | Ordner, der noDesk-Systemdateien enthlt
           |         | (z.B. '$NDHOME\NDSYS')
deskfile   | vnxs    | Name des Skriptes, das den Aufbau des Desktops
           |         | enthlt (z.B. 'CNF\640X480\DESK.NDS' -
           |         | relativ zu $HOME)
initfile   | vnds    | Name des Skriptes, das Bildschirmauflsungs-
           |         | abhngige Variablendefinitionen, etc. enthlt
           |         | (z.B. 'CNF\640X480\INIT.NDS' - relativ zu $HOME)
globfile   | vds     | Name des Skriptes fr globale (Bildschirm-
           |         | auflsungsunabhngige) Variablendefinnitionen,
           |         | aliase, etc.
           |         | (z.B. 'CNF\GLOBALS.NDS' - relativ zu $HOME)
etcfile    | vds     | Name der optionalen Skriptdatei, die am Ende
           |         | des Scriptes $deskfile ausgefhrt wird
nddfile    | vrns    | Name der Objektdefinitionsdatei
ndifile    | vrns    | Name der ICON-Zuordnungsdatei
rscfile    | v       | Name der ICON-Recourcedatei
           |         |
wfindcmd   | x       | enthlt eine interne Information fr das
           |         | Kommando wfind
filekeys   | dx      | wenn gesetzt, dann wird der Dateicursor in
           |         | Fenstern dargestellt
forceslider| dx      | wenn gesetzt, dann werden grundstzlich alle
           |         | Slider eines Fensters gezeichnet 
wlsnoalign | dx      | wenn gesetzt, dann wird KEIN Raster fr die
           |         | Gre eines LS-Fensters verwendet
notestdrv  | x       | wenn gesetzt, dann wird vor Auslagern von
           |         | noDesk NICHT berprft, ob noch genug Platz
           |         | zum Sichern der temporren Scriptdatei
           |         | ($TEMPFILE) verfgbar ist
checkobts  | x       | enthlt die Objekttypen, die beim Laden des
           |         | Desktops auf ihre Existenz berprft werden
           |         | sollen
toptxt     | x       | dieser Text erscheint rechtsbndig in der
           |         | Menleiste (z.B. 'set toptxt = $UNAME', dann
           |         | steht dort immer der aktuelle Benutzername')
msgcolor   | nxs     | die Farbe, in der der Inhalt von 'toptxt'
           |         | dargestellt wird
popdelay   | ndxs    | Wert zum Steuern der Scrollgeschwindigkeit
           |         | von PopUp-Mens
           |         |
LINE       | ns      | in dieser Variable steht der Inhalt einer
           |         | Dialogeingabe, der Inhalt wird erneut parsiert
           |         | (s.o.)
           |         | (z.B. legt das interne Kommando getline hier
           |         | seinen String ab)
prompt     | vx      | Zeichenkette, die am Beginn einer Kommando-
           |         | zeile im shell steht. Folgende Krzel werden
           |         | interpretiert:
           |         |   $h  Historyeintrag
           |         |   $d  aktuelles Laufwerk
           |         |   $p  aktueller Arbeitspfad
           |         |   $s  Anzeige von '#', wenn die shell von
           |         |       einem anderem Programm aufgerufen wurde
           |         |   $$  '$'
           |         |   $r  Wagenrcklauf (cr)
status     | vrns    | enthlt den Rckgabewert eines Kommandos
history    | vnx     | maximale Eintrge der History-Liste
ignoreerr  | vx      | wenn gesetzt, dann wird ein Skipt im normalen
           |         | Fehlerfall nicht abgebrochen
noclobber  | vx      | bei Ausgabeumlenkung '>' in eine Datei, darf
           |         | diese noch nicht existieren, bei '>>' mu
           |         | diese existeren (s.o.)
noxArg     | xs      | keine Parameterbergabe an ein Programm ber
           |         | xArg-Verfahren
noARGV     | x       | keine Parameterbergabe an ein Programm ber
           |         | ARGV-Verfahren
chainproc  | nxs     | Prozentangabe zum Auslagern von noDesk
chainabs   | nxs     | Kilobyteangabe zum Auslagern von noDesk
           |         | berschreitet die Gre eines Programms +
           |         | 'chainproc'-Prozent des Programms +
           |         | chainabs-Kilobyte den grtmglichen
           |         | Speicherbereich, so wird unter Normal-TOS
           |         | noDesk ausgelagert
fastsave   | dx      | wenn gesetzt, dann wird beim Desktop-Speichern
           |         | eine optimierte, aber nicht mehr lesbare Datei
           |         | erzeugt
fastxsave  | dxs     | wenn gesetzt, dann wird beim Auslagern von
           |         | noDesk eine optimierte, aber nicht mehr
           |         | lesbare Datei erzeugt
useKobold  | dx      | das Hilfsprogramm 'KOBOLD' wird benutzt
           |         | (bei cp, mx, rm)
koboldPRG  | dx      | Name und Pfadangabe von 'KOBOLD'
           |         |
version    | rns     | enthlt die aktuelle Versionsnummer des noDesk
           |         | als String (z.B. "3.00")
CPU        | rns     | Name des internen Prozessors (z.B. MC68000)
TIME       | rns     | aktuelles Datum und Uhrzeit im Format:
           |         | 'Djjmmtthhmmss'
screenw    | rns     | Breite des Bildschirms in Pixeln
screenh    | rns     | Hhe des Bildschirms in Pixeln
ncolors    | rns     | Anzahl der Farbebenen (Planes) des Bildschirms
noWcon     | dx      | wenn gesetzt, dann werden keine WCON-Fenster
           |         | benutzt (s.o.) (nicht setzbar unter
           |         | Multitasking-Betriebssystemen)
wshpos     | x       | Koordinaten des WSH-Fensters
wcon1pos   | x       | Koordinaten des WCON1-Fensters
wcon2pos   | x       | Koordinaten des WCON2-Fensters
wcon3pos   | x       | Koordinaten des WCON3-Fensters
wauxicrnl  | x       | Umwandlung von 'cr' in 'crln' bei serieller Eingabe
wauxocrnl  | x       | Umwandlung von 'cr' in 'crln' bei serieller Ausgabe
wauxwin    | x       | WCON-Fensternummer des Terminalfensters
wtalkwin   | x       | WCON-Fensternummer des Talkfensters
           |         |
deskcolor  | ndxs    | Farbe des Desktophintergrundes  (0-15)
deskpatt   | ndxs    | Muster des Desktophintergrundes (0- 7)
wincolor   | ndxs    | Hintergrundfarbe von Fenstern   (0-15)
winpatt    | ndxs    | Hintergrundmuster von Fenstern  (0- 7)
blitter    | dxs     | wenn gesetzt, wird ein vorhandener Blitter
           |         | angeschaltet
cpucache   | dxs     | wenn gesetzt, wird ein vorhandener CPU-Cache
           |         | angeschaltet (ab Prozessoren des Typs MC68030
           |         | aufwrts)
topdelay   | ndxs    | Zeitwert zum automatischen Fensterwechsel,
           |         | wenn die Maus auf ein anderes Fenster gefhrt
           |         | wird (0 = AUS)
kbdelay    | ndxs    | Wert der Verzgerung bis die Tastaturwieder-
           |         | holung einsetzt. Mglich sind Werte von
           |         | 0 (AUS) bis 99
kbrepeat   | ndxs    | Geschwindigkeit der Tastaturwiederholung.
           |         | Mglich sind Werte von 0 (AUS) bis 99
linenums   | dxs     | wenn gesetzt, dann werden in Textfenstern
           |         | Zeilennummern angezeigt
tabsize    | ndxs    | Lnge eines Tabulator-Zeichens (0 bis 20)
fontsize   | ndxs    | Gre des Systemfonts in Textfenstern
           |         | (momentan: 4, 6, 9, 12, 13 oder 26)
maxfiles   | ndxs    | maximale Anzahl von Dateien, die in einem
           |         | LS-Fenster dargestellt werden knnen
           |         | (minimal 224)
wlsmaxcl   | ndxs    | Anzahl der Spalten in einem LS-Fenster
           |         | (0 = automatische Berechnung anhand der
           |         | Fenstergre)
wlslook    | ndxs    | Art der Darstellung in einem LS-Fenster
           |         | mgliche Werte:
           |         |   "B"       Icons
           |         |   "N"       normaler Text
           |         |   "K"       kleiner Text
wlssort    | ndxs    | Art der Sortierung in einem LS-Fenster
           |         | mgliche Werte:
           |         |   "A"       nach Art
           |         |   "N"       nach Namen
           |         |   "D"       nach Datum
           |         |   "G"       nach Gre
           |         |   "U"       unsortiert, d.h. Reihenfolge
           |         |             im Dateisystem 
wlstxtshow | ndxs    | Art der anzuzeigenden Informationen bei
           |         | Textdarstellung in einem LS-Fenster. Diese
           |         | Variable kann einen String aus den folgenden
           |         | Buchstaben enthalten:
           |         |   "G"       mit Gre
           |         |   "A"       mit Attributen
           |         |   "D"       mit Datum
           |         |   "T"       mit Uhrzeit
           |         | Wenn der Inhalt von wlstxtshow "GADT" ist,
           |         | dann werden also Texte mit allen mglichen
           |         | Dateiinformationen angezeigt.
wlsincols  | dx      | wenn gesetzt, dann wird ein LS-Fenster in
           |         | Spalten aufgebaut
wlswithhid | dxs     | wenn gesetzt, dann werden auch 'versteckte'
           |         | Dateien in einem LS-Fenster angezeigt
wlswithsys | dxs     | wenn gesetzt, dann werden auch 'System'-
           |         | Dateien in einem LS-Fenster angezeigt
wlsfastdraw| dx      | wenn gesetzt, dann wird eine optimierte
           |         | Ausgabefunktion verwendet, um Icons oder
           |         | groen Text in LS-Fenstern darzustellen
           |         | (bentigt aber mehr Speicher pro Fenster!!!)
cpdialog   | ndxs    | Ausgabemodus fr das cp-Kommando
           |         | mgliche Werte:
           |         |   "n"       keine Ausgaben
           |         |   "c"       mit Startdialog
           |         |   "v"       Ausgaben zeigen, aber kein Dialog
           |         |             mit Benutzer
           |         |   "i"       mit Einzelbesttigung jeder Datei
mvdialog   | ndxs    | Ausgabemodus fr das mv-Kommando (Werte siehe
           |         | cpdialog)
rmdialog   | ndxs    | Ausgabemodus fr das rm-Kommando (Werte siehe
           |         | cpdialog)  
touchdialog| ndxs    | Ausgabemodus fr das touch-Kommando (Werte
           |         | siehe cpdialog)
cpsmallmem | dx      | wenn gesetzt, dann verwenden die Kommandos
           |         | cp und mv nur einen kleinen Speicherbereich
           |         | (unter Multitasking-Betriebssystemen ohne
           |         | Bedeutung)
warnifro   | dxs     | wenn gesetzt, dann erscheint bei den Kommandos
           |         | mv und rm eine Warnung falls eine Datei das
           |         | 'nur lesbar Flag' gesetzt hat
warnifcnfl | dxs     | wenn gesetzt, dann erscheint bei den Kommandos
           |         | cp und mv auf jeden Fall eine Warnung falls
           |         | ein Namenskonflikt entsteht (Datei bzw.
           |         | Ordner existiert schon im Ziel)
cpsetdate  | dx      | wenn gesetzt, dann erhlt eine Datei-Kopie das
           |         | aktuelle Datum
cpclearsrc | dx      | wenn gesetzt, dann wird das Archiv-Flag der
           |         | Quell-Datei beim Kopieren einer Datei gelscht
cpcleardst | dx      | wenn gesetzt, dann wird das Archiv-Flag der
           |         | Ziel-Datei beim Kopieren einer Datei gelscht
cmrwinfcnt | ndxs    | Anzahl der Dateien, ab der der Kopierdialog
           |         | im Fenster luft
cmrwinbcnt | ndxs    | Kilobytes, ab der der Kopierdialog im Fenster
           |         | luft
           |         |
multiuser  | vr      | das noDesk-System luft im Multiuserbetrieb
UNAME      | vrns    | Name des Users
UID        | rns     | Benutzernummer im Multiuserbetrieb
GID        | rns     | Gruppennummer im Multiuserbetrieb
--------------------------------------------------------------------------------


A2  besondere CLI-Anweisungen
------------------------------
- 'return'-Kommando
  Definition      return [<Value>]
  Verwendung in   Skripten
  Beschreibung    bricht die Bearbeitung eines Scripts' ab.
                  der optionale Parameter <value> steht nach Abbruch des
                  Scripts' in der Variablen 'status'


- 'goto'-Kommando
  Definition      goto <Labelname>
  Verwendung in   Skripten
  Beschreibung    Steht innerhalb eines Skriptes die unbedingte Sprung-
                  anweisung zu einem Labelnamen, so sucht der CLI das gesamte
                  Skript nach dem Vorkommen von <Labelname> ab und fhrt
                  die Skriptbeabeitung nach dem Label fort. Wird kein
                  Labelname gefunden so wird das Skript in jedem Fall
                  abgebrochen.
                  Der Labelname darf maximal 12 Buchstaben oder Zahlen
                  umfassen, mu mit einem Buchsstaben beginnen und durch
                  einen ':' beendet werden. Es wird Gro- und Kleinschreibung
                  beachtet! Der Labelname mu allein in einer Zeile und
                  auerhalb aller Schleifenkonstrukte und bedingten
                  Anweisungen stehen.

  Beispiel        testit:
                  .
                  .
                  .
                  if (-e TEST.C) goto testit


- 'if'-Kommando
  Definition      if (<Bedingung>) <Kommando>
                  oder
                  if (<Bedingung>) then
                      <Kommando>
                      .
                  [else
                      <Kommando>
                      .]
                  [elif (Bedingung) then
                      <Kommando>
                      .]
                  endif
  Verwendung in   Skripten, Objektdefinitionsdatei, (einzeilig in der shell)
  Beschreibung    Durch das 'if'-Kommando wird eine Anweisung nur dann
                  ausgefhrt, wenn die in Klammern stehende Bedingung
                  erfllt ist.
                  Das Kommando liegt in zwei Varianten vor:
                  1.  einer einzeiligen, bei der das bedingte Kommando
                      unmittelbar hinter die Bedingung geschrieben werden
                      mu, und
                  2.  einem mehrzeiligen Konstrukt, welches immer durch
                      'endif' beendet werden mu.
                  Ist die Bedingung erfllt, werden alle Kommandos der
                  nchsten Zeilen bis zu einem 'endif', 'else' oder 'elif'
                  ausgefhrt. Ist die Bedingung nicht erfllt, werden die
                  Kommandos, die nach einem optionalen 'else' stehen,
                  ausgefhrt. Das Kommando 'elif' steht fr 'else if' und
                  prft im 'else'-Fall erneut eine Bedingung; dieses
                  Kommando verhindert das Schachteln von 'if'-Konstrukten.
                  Die Kommandos 'if ... then', 'else', 'elif ... then' und
                  'endif' mssen allein in einer Zeile stehen.

  Beispiel        if (! -e "\TEMP") then
                      mkdir "C:\TEMP"
                      cp test.c \temp
                  elif (! -e "\TEMP\TEST.C") then
                      cp test.c \temp
                  else
                      echo test.c wurde schon kopiert
                  endif


- 'foreach'-Kommando
  Definition      foreach <Variablenname> <Liste>
                      Kommando
                      .
                  end
  Verwendung in   Skripten, Objektdefinitionsdatei
  Beschreibung    Das 'foreach'-Kommando weist einer Variablen nacheinander
                  jedes Wort in einer definierten 'Liste' zu. Die Kommandos
                  bis zum Kommando 'end' werden solange ausgefhrt, bis die
                  'Liste' leer ist. Das Kommando 'end' mu allein in einer
                  Zeile stehen.
                  Die Liste enthlt Wrter, die durch Leerzeichen voneinander
                  getrennt sind. Die Liste kann durch Klammern eingerahmt
                  werden. Die Wrter knnen 'wildcards' enthalten, diese
                  werden zu Beginn des Kommandos expandiert.
                  Mit dem Kommando 'continue' wird zum Beginn der bedingten
                  Kommandos gesprungen und mit dem nchsten Listeneintrag
                  weitergemacht. Das Kommando 'break' bricht die Bearbeitung
                  der Schleife ab und fhrt mit dem Kommando unterhalb von
                  'end' fort.

  Beispiel        foreach i (*.c *.h *.prj *.cfg)
                      lharc a test.lzh $i
                      echo "$i wurde gerade archiviert..."
                  end


- 'while'-Kommando
  Definition      while (<Bedingung>)
                      Kommando
                      .
                  wend
  Verwendung in   Skripten, Objektdefinitionsdatei
  Beschreibung    Solange die Bedingung erfllt ist, werden alle Kommandos
                  zwischen 'while' und 'wend' ausgefhrt. Die Kommandos
                  mssen allein in einer Zeile stehen. Mit 'break' wird die
                  Schleife abgebrochen, mit 'continue' erneut zur 'while'-
                  Bedingung gesprungen.

  Beispiel        set i = 1
                  while ($i < 10)
                      echo $i". Durchlauf"
                      set i @ $i + 1
                  wend
