MultiTOS für Einsteiger Teil 5 - MultiTOS goes UNIX Teil I

Nachdem wir vor zwei Monaten ein Mini-UNIX gebastelt haben und ein „kursloser“ Monat genügend Zeit zum experimentieren gab, wollen wir diesmal ein beinahe komplettes UNIX-System unter MultiTOS einrichten. Aus diesem Grund plädiere ich für eine Namensänderung unseres Kurses, aus „MultiTOS für Einsteiger“ sollte nun „MultiTOS goes UNIX“ werden.

Um die Beschaffung der verwendeten Dateien und Programme zu vereinfachen, wird die ST-Computer eine PD-Diskette mit allem Benötigten zur Verfügung stellen. Auf ihr befindet sich ein selbstauspackendes Archiv namens UNIX.TOS. Zum Auspacken muß dieses Programm auf eine Festplatte mit mindestens 2MB freiem Speicher kopiert und danach gestartet werden. Bei der geneigten Leserschaft möchte ich mich gleich im voraus für den nun folgenden Artikel, der reich an Tabellen und Listings und daher ein wenig „staubig“ (hust, hust) ist, entschuldigen, aber schließlich brauchen wir Arbeitsgrundlagen. Alles einsteigen und die Türen schließen, der UNIX-Zug fährt ab ...

Die wichtigste Neuerung, an die wir uns unbedingt gewöhnen müssen, ist die Tatsache, daß unter UNIX alle Laufwerke (C:, D: usw.) zu einem einzigen Dateisystem zusammengefaßt sind. Es existieren also unter dem echten UNIX keine Laufwerke! Wie in den vorhergegangenen Teilen schon erwähnt, simuliert MultiTOS dieses Verhalten unter dem Pseudolaufwerk U:. Hierin sind alle anderen Laufwerke (und einiges mehr) zu finden. Die oberste Regel der UNIX-Basteleien lautet: Nur noch unter U: arbeiten! Im folgenden beziehen sich daher auch alle relativen Pfadangaben, wie z.B./USR/HOME, auf das Laufwerk U: - also hier auf U:/USR/ HOME. Wenn man sich erst einmal an diese Konvention gewöhnt hat, kann es das Arbeiten sehr erleichtern.

Vorbereitungen

Unter unserem Minimal-UNIX vom letzten Kurs haben wir bereits eine Ordnerstruktur für das Arbeiten mit UNIX angelegt. Diese wollen wir nun erweitern und etwas ausführlicher besprechen. Zuerst das Anlegen der benötigten Ordner: Im Ordner MULTITOS auf dem Boot-Laufwerk (C:) benötigen wir folgende Ordnerstruktur:

Das benötigte Dateisystem

Um das ganze nun UNIX-like unter U: anzutreffen, setzten wir entsprechende Links, dazu müssen in die Datei MINT-CNF folgende Zeilen eingetragen werden:

sin c:\multitos\unix\bin u:\bin 
sin c:\multitos\unix\etc u:\etc 
sin c:\multitos\unix\usr u:\usr

Die Zeile sin c:\multitos\unix\home u:\home, die wir beim letzten Mal noch verwendet haben, ist nicht mehr nötig und sollte entfernt werden.

Unter UNIX sind ferner noch einige elementare Environment-Variablen wichtig. Diese „Notizen“ stehen allen Programmen zur Verfügung und geben Auskunft über das System. Am besten geben wir diese Variablen gleich in die Datei GEM.CNF ein. Hierzu müssen die folgenden Zeilen in GEM.CNF eingetragen werden:

setenv PATH=.:/bin/:/usr/bin 
setenv HOME=/usr/home 
setenv ENV=/usr/home/kshrc.ksh 
setenv SHELL=/bin/sh.ttp

Nach einem Neustart des Systems (Booten) sollten sich die Ordner BIN, ETC und USR im Wurzelverzeichnis von Laufwerk U: finden:

Das UNIX-Dateisystem

Dem UNIX-Kenner wird bereits aufgefallen sein, daß diese Installation auf die Korn-Shell ausgerichtet ist. Dies dürfte die verbreitetste Shell unter UNIX sein, und es existieren auch einige Public-Domain-Versionen für MiNT. Zwar gibt es auch für MiNT diverse andere Shells, von der Bourne-Shell bis zur C-Shell, aber nach meiner Meinung bietet die Korn-Shell das beste Verhältnis von Kompliziertheit zu Benutzerfreundlichkeit. Nebenbei enthält sie praktisch auch alle Funktionen der Bourne-Shell, daher ist in diesem und den folgenden Kursteilen nur noch von der Korn-Shell die Rede ...

# Der Inhalt von /BIN
   
cat.ttp Gibt Dateien auf die Standardausgabe aus
cmp.ttp Vergleicht zwei Dateien und gibt die Unterschiede aus
cp.ttp Kopiert Dateien
date.ttp Gibt das aktuelle Datum aus
df.ttp Gibt den freien Speicher aller Festplatten aus
du.ttp Gibt den belegten Speicher aus
kill.ttp Sendet Signale an Prozesse
ls.ttp Zeigt Inhaltsverzeichnisse an
mkdir.ttp Erzeugt einen Ordner
mv.ttp Verschiebt Dateien
nice.ttp Setzt die Prioritäten eines Prozesses
ps.ttp Zeigt die aktiven Prozesse an
rm.ttp Loscht Dateien
rmdir.ttp Löscht Ordner
sh.ttp Die Korn-Shell (kann auch ksh.ttp sein)
sleep.ttp Wartet eine bestimmte Zeit
sort.ttp Sortiert eine Eingabe
tpipe.ttp Verzweigt eine Pipe

Der Inhalt von /USR/BIN

   
cal.ttp Gibt einen ganzen Kalender aus!
compress.ttp Der Standard-UNIX-Packer
expand.ttp Das Gegenstück zum Packer der UNIX-Entpacker
find.ttp Sucht Dateien
grep.ttp Sucht nach Text
head.ttp* Gibt die ersten Zeilen von Dateien aus
look.ttp Sucht nach Zeilen in einer sortierten Liste
man.ksh Script zum Anzeigen der Hilfstexte Dieses Script folgt noch...
mem.ttp Gibt den freien RAM-Speicher aus
mintvers.ttp Gibt die MiNT-Versionsnummer aus
more.ttp Gibt Dateien oder die Standardeingabe seitenweise aus. Dieses Programm folgt noch…
nroff.ttp Programm zum Formatieren von Texten
od.ttp Gibt eine Datei als Zahlenkolonne aus
reverse.ttp Dreht eine Datei um
strings.ttp Zeigt Texte aus einer Binardatei an
tail.ttp Zeigt die letzten Zeilen einer Datei an
top.ttp Zeigt den Systemzustand an
touch.ttp Ändert das Dateidatum
tsort.ttp Sortiert Dateien
umq.ttp Zeigt doppelte Zeilen in einer Datei an
wc.ttp Zählt die Wörter in einer Datei

Tabelle 1

Die Ordner

Warum liegen eigentlich diese Ordner mit den kryptischen Namen (BIN, ETC, USR usw.) im Laufwerk U:? Tja, praktisch unter jedem UNIX-System finden sich diese Ordner direkt im Wurzel Verzeichnis, in ihnen liegen wichtige Bestandteile des Systems, und vieeeeele UNIX-Tools verlassen sich auf diese Ordnerstruktur. Was liegt denn nun wo genau?

/ETC
Diesen Ordner dürfen Sie unter einem echten UNIX-System in der Regel nicht einmal „betreten“, hier finden sich nämlich sicherheitsrelevante Dateien und Programme, z.B. PASSWD, die Datei mit den Paßwörtern aller Benutzer, und GROUP, die Liste mit der Gruppenzugehörigkeit der Benutzer (unter MultiTOS werden PASSWD und GROUP noch nicht verwendet).

Beispiel einer PASSWD-Datei:

root::0:0:Operator:/:/bin/sh.ttp 
daemon:*:1:1:Ms Kernel:/etc: 
bin:*:2:2:Mr Binary:/bin:

Beispiel einer GROUP-Datei:

wheel:*:0 : root
daemon:*:1: daemon
bin:*:2: bin
sys:*:3:
adm:*:4:
uucp:*:5:
mail:*:7:

Es finden sich aber auch Dateien mit wichtigen Informationen zum System, z.B. TERMCAP, eine Datei, die den Programmen „erklärt“, wie der Bildschirm zu steuern ist, und PROFILE, ein Script (dazu später mehr), das beim Starten der Shell ausgeführt wird. Ein Beispiel der TERMCAP-Datei finden Sie in Listing 1.

/BIN
Hier finden sich die wichtigsten externen Befehle und Tools, z.B. LS.TTP.

/USR
Dieser Ordner ist die eigentlich Spielwiese für die UNIX-Benutzer (User). Hier sollten sich wieder diverse Unterordner finden:

/USR/BIN
Analog zu /BIN liegen hier weitere (seltener benutzte) UNIX-Tools und vor allem diverse Anwenderprogramme (C-Compiler, Editoren usw.).

/USR/LIB
Hierher gehören Dateien, die von vielen Programmen genutzt werden, wie z.B. die C-Bibliotheken, Makros usw.

/USR/MAN
Eine der besten Traditionen unter UNIX ist die Tatsache, daß praktisch für jeden Befehl bzw. jedes Programm ein Hilfstext in diesem Ordner zur Verfügung steht! Damit erübrigt sich das Blättern in tausendseitigen Handbüchern ...

/USR/TEMP
Der Ordner für temporäre Dateien; hier werden Dateien, die nur kurzzeitig benötigt werden, angelegt.

/USR/HOME
Die Heimstadt des Benutzers. Unter einem echtem UNIX-System existiert praktisch für jeden Benutzer ein eigener HOME-Ordner; da wir aber unter MultiTOS vorerst noch alleine am Werke sind, genügt auch ein HOME. Im Regelfall kann ein Benutzer in seinem HOME-Ordner schalten und walten, wie er will, allerdings suchen viele Programme beim Starten nach bestimmten Dateien im jeweiligen HOME-Ordner. Damit ist es z.B. möglich, Programme auf die eigenen Bedürfnisse anzupassen.


st|st52|st25|atari st vt52:li#25:co#80:\
    :al=\EL:am:bs:cd=\EJ:ce=\EK:cl=\EE:\
    :cm=\EY%+ %+ :dl=\EM:ms:\
    :nd=\EC:pt:se=\Eq:so=\Ep:sr=\EI:ue=\Eq:up=\EA:do=\EB:\ 
    :us=\Ep:vi=\Ef:ve=\Ee:bl=\007:
#
    mw|mw|MiNT program MW emulating Atari ST/VT52:li#25:co#80:\ :al=\EL:am:bs:cd=\EJ:ce=\EK:cl=\EE:\
    :cm=\EY%+ %+ :dl=\EM:ms:\
    :nd=\EC:pt:se=\Eq:so=\Ep:sr=\EI:ue=\Eq:up=\EA:do=\EB:\
    :us=\Ep:vi=\Ef:ve=\Ee:bl=\007:\
    :im=\Eh:ei=\Ei:mi:dc=\Ea:\
    :hs:ts=\ES:fs=\015:

Listing 1: Beispiel einer TERMCAP Datei


# khsrc.ksh
# Start-Script für Public Domain Korn-SHell
# Diese Datei wird bei jedem Starten der
# Shell automatisch ausgeführt!

    # Test auf interaktive Shell ... 
    interactive=false 
    case "$-" in *i*)
        interactive=true

        # Setzen der Shell-Optionen ... 
        set -o emacs
        set -o monitor 
        set -o trackall 
        set -o hashall 
        set -o bgnice 
        set -o unixpath

        # Tasten belegen...
        bind ^[C=forward-char       # Cursor right
        bind ^[D=backward-char      # Cursor left

        bind ^[c=end-of-line        # shift cursor right
        bind ^[d=beginning-of-line  # Shift cursor left

        bind ^X^[C=forward-word     # Ctrl-Cursor right
        bind ^X^[D=backward-word    # Ctrl-Cursor left

        bind ^[A=up-history         # Cursor up
        bind A[B=down-history       # Cursor down
        bind ^[E=search-history     # Home
        bind ^[H=list-file          # Help
        bind ^I=complete            # Tab
        bind ^[I=complete-file      # Insert

        bind ^H=delete-char-backward # Backspace
        bind ^?=delete-char-forward # Delete
        bind ^[K=kill-line          # Undo

        # Sinnvolle Prompts anlegen ...
        PS1='[$PWD]: '              # zeigt den aktuellen Pfad im Prompt
        PS2="»"

        # Alias-Definitionen ... 
        alias lc="ls"
        alias ls="ls -F" 
        alias ll="ls -allmore" 
        alias cls="print -n '\033'v'\033'E" 
        alias cd..="cd .."

        # History ...
        export HISTFILE=$HOME/history.sh 
        export HISTSIZE=50

        # In das HOME-Verzeichnis wechseln ... 
        cd ~
        ;;
    *)
        # Nicht interaktiv ... 
        interactive=false
        ;;
    esac

Listing 2: Die Datei KSHRC.KSH

Die Füllung

Da bekanntlich leere Ordner wenig nützen, müssen wir unsere UNIX-Ordner mit den entsprechenden Tools füllen. Wer unsere schon erwähnte UNIX-Diskette benutzt, ist fein raus, denn dort sind schon alle nötigen Dateien vorhanden. Besitzer eines Modems werden das Benötigte auch in diversen Mailboxen finden. Den Inhalt von /BIN und /USR/BIN finden Sie in Tabelle 1.

Die Korn-Shell

Zwar ist es unter MultiTOS auch möglich, diese UNIX-Tools via Doppelklick einfach vom Desktop aus zu starten, aber der wahre Nutzen stellt sich erst in Verbindung mit einer Shell ein. Vereinfacht gesagt, nimmt eine Shell die (Tastatur-)Eingaben des Benutzers entgegen, interpretiert diese und reagiert abhängig vom Ergebnis der Interpretation entsprechend, z.B. indem sie Programme startet. Sie stellt also das Benutzer-Interface zum System dar. Nach diesem Prinzip ist auch das Desktop eine Shell, nur eben eine grafische, via Maus gesteuerte. Im Gegensatz dazu werden die UNIX-Shells in der Regel via Tastatur gesteuert, so auch die Korn-Shell, auf die wir uns nun konzentrieren wollen.

Im letzten Kursteil haben wir ja schon erste Schritte mit der Shell unternommen, nun gehen wir wieder ein Stück zurück und verfolgen den Start der Korn-Shell. Im Ordner /BIN findet sich das Programm SH.TTP. Starten Sie dieses wie gewohnt vom Desktop aus mit einem Doppelklick. In der nun auftauchenden Dialogbox zur Eingabe der gewünschten Parameter geben Sie bitte -L ein und klicken auf „OK“. Der Parameter -L zeigt der Korn-Shell an, daß sie als interaktive Shell arbeiten soll und entsprechende Einrichtungsarbeiten ausführen muß. Als erste Amtshandlung sucht die Korn-Shell nun im Ordner /ETC nach der Script-Datei PROFILE. Halt, halt, was ist ein Script? Ein Script ist eine ASCII-Datei, die Befehle für eine Shell enthält. So ein Script wird Zeile für Zeile abgearbeitet, beinahe so, wie wenn die Befehle direkt von der Tastatur kommen würden. Damit können z.B. häufig vorkommende Befehlssequenzen praktischerweise in einer Datei abgelegt und später wie ein Programm aufgerufen werden. In dem speziellen Script /ETC/PROFILE stehen nun Befehle, die immer beim Start der Shell und bei jedem Benutzer ausgeführt werden sollen. In unserem Falle werden lediglich diverse Environment-Variablen gesetzt. Die Bedeutung der einzelnen Shell-Befehle werden wir im Laufe der Zeit erarbeiten; soviel zum Anfang: Das Zeichen „#“ kennzeichnet einen Kommentar, der Rest der Zeile wird von der Shell ignoriert. Der Befehl export setzt eine Environment-Variable global (das Environment werden wir später noch näher unter die Lupe nehmen).

Die Datei PROFILE:

# profile für die Korn-SHell ...
# Diese Datei wird automatisch
# ausgeführt,
# wenn die Shell als Login-Shell
# gestartet wird.
# Setzen diverser Shell-Variablen ...
    export HOME=/usr/home 
    export PATH=.:/bin:/usr/bin 
    export SHELL=/bin/sh.ttp 
    export ENV=/usr/home/kshrc.ksh 
    export TMP=/usr/temp/ 
    export TMPDIR=$TMP 
    export TEMP=$TMP

So, damit sind die globalen Sachen erledigt, nun kommt die Anpassung an den Benutzer. Hierfür sucht die Korn-Shell im Heimatordner des Benutzers nach der Script-Datei KSHRC.KSH (Listing 2) und führt diese aus.

Ok, zugegeben, dieses Script ist für den Einsteiger kaum zu durchschauen, aber dafür paßt es die Korn-Shell recht gut an die „ATARI-Umgebung“ an. Ich verspreche, im Laufe der Zeit wird sich der Nebel lichten. Die bind-Befehle zum Bleistift belegen die ATARI-Tastatur mit Befehlen für die Korn-Shell, damit gilt beim Arbeiten mit der Korn-Shell unter MultiTOS folgende Tastaturbelegung.

   
Pfeil nach links Cursor ein Zeichen nach links
Mit Shift Cursor an den Anfang der Zeile
Mit Control Cursor ein Wort nach links
Pfeil nach rechts Cursor ein Zeichen nach rechts
Mit Shift Cursor an das Ende der Zeile
Mit Control Cursor ein Wort nach rechts
Pfeil nach oben Eine Zeile zurückblättern
Pfeil nach unten Eine Zeile vorblättern
Home In den alten Eingaben suchen
Help Anzeigen der Dateien im aktuellen Ordner
Tab Komplettiert die Eingabezeile anhand der alten Eingaben
Insert Komplettiert die Eingabezeile anhand der Dateien im aktuellen Ordner
Backspace Löscht das Zeichen links vom Cursor
Delete Löscht das Zeichen unter dem Cursor
Undo Löscht die aktuelle Eingabezeile

Damit sind alle Initialisierungsarbeiten abgeschlossen, und auf dem Bildschirm meldet sich die Korn-Shell mit einem vergnügten Prompt ([usr/home]:) zur Arbeit. Aus praktischen Gründen wurde die Eingabeaufforderung (das ominöse Prompt) der Korn-Shell im KSHRC.KSH so eingestellt, daß in ihm immer der aktuelle Pfad angezeigt wird und Sie damit immer wissen, wo im Dateibaum Sie sich derzeit befinden.

Die Manual-Pages

Eigentlich könnten wir nun arbeiten. Aber nicht genug der Verwirrung, der nächste Hammer folgt sofort, denn leider gibt es bis dato kaum brauchbare Versionen von man unter MiNT bzw. habe ich kein man gefunden, das auch sauber in einem Fenster arbeitet. Der Befehl man ist aber „lebensnotwendig“ unter UNIX, denn er ersetzt praktisch das Handbuch. Wie schon erwähnt, gibt es in einem UNIX-System zu jedem Befehl einen Hilfstext, und damit Sie diesen nun nicht immer per Hand suchen müssen, gibt es auch noch den Befehl man. Das Eintippen von man Is, gefolgt von der Taste „Return“ unter einer UNIX-Shell bringt zum Beispiel den Hilfstext zum Befehl Is auf den Bildschirm. Tja, was tun? Wozu gibt es denn Scripts unter der Korn-Shell? Das Script man.ksh ist in Listing 3 zu finden.

Haben Sie dieses Script mit einem beliebigen ASCII-Editor abgetippt und im Ordner /USR/BIN abgelegt, machen Sie sich über seine Arbeitsweise zunächst noch keine Gedanken. Verwenden Sie es einfach, denn natürlich überfordert auch dieses Script den Einsteiger völlig; aber zur „Eingewöhnung“ unter UNIX ist es sehr wichtig, auf die Online-Hilfe zugreifen zu können. Haben Sie unsere UNIX-Disk installiert, und wollen Sie schon mehr über die Korn-Shell wissen? Dann tippen Sie einfach man sh, und schon wird Ihnen geholfen.

Wer unsere UNIX-Disk nicht besitzt, wird wahrscheinlich vor einem weiteren Problem stehen. Das Problem nennt sich more. ttp. Dieses Programm zeigt unter UNIX Dateien bzw. die Standardeingabe seitenweise an, z.B. damit Sie auch mehrseitige Hilfstexte in Ruhe durchlesen können. Auch hier konnte keine copyright-freie Version für MiNT gefunden werden, die ordnungsgemäß in einem Fenster läuft. Also ist selber programmieren angesagt, diesmal allerdings nicht als Shell-Script, sondern in C, der C-Code aus Listing 4 sollte unter jedem C-Compiler übersetzbar sein und liefert ein minimales more.ttp, das auch unter MiNT funktioniert.

Wenn Sie eine Datei mit diesem more anzeigen lassen, sehen Sie am Ende der Seite den Text -more- (weiße Schrift auf schwarzem Grund). Immer wenn dieser Text zu sehen ist, gilt folgende Tastenbelegung:

   
Leertaste Eine Seite weiterblättern
Return Eine Zeile weiterblättern
q oder Q Beenden von „more"

Jubel und Freude, nun hätten wir eine lauffähige und „UNIX-mäßige“ Installation der Korn-Shell auf den Weg gebracht, das „UNIXen“ unter MultiTOS kann beginnen.


# man.ksh
# Primitives man für die KornSHell 

FOUND=false

# Überprüfung, ob ein Parameter angegeben ist ... 
if [ $# = 0 ]
then
    echo Fehler: Parameter fehlt! >&2 
    echo Beispiel: man ls >&2 
    exit 1
fi

# Durchsuchen der Manual-Verzeichnisse... 
if cd /usr/man/cat1
then
    if [ -f $1.1 ] 
    then
        more $1.1 
        FOUND=true
    fi
fi
for i in 1 2 3 4 5 6 7 8 
do
    if [ -d /usr/man/man$i ] 
    then          cd /usr/man/man$i
        if [ -f $1.$i ] 
        then
            nroff -man $1.$i|more 
            FOUND=true
        fi
    fi
done

# Hilfe gefunden oder nicht... 
if [ $FOUND = false ]
then
    echo Keine Manual-Page zu $1 gefunden! >&2 
    exit 1 
else 
    exit 0
fi

Das Script man.ksh


/* Kleines "more.ttp" */ 
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
#include <screen.h>

void opt_error(char *s)
{
    fprintf(stderr,"Illegal option %s\n",s); 
    fprintf(stderr,"Syntax: more [-nXX] [file]\n");
    exit(1);
}/* opt_error */

int main(int argc, const char *argv[])
{
    int i,z,w,t,f,page=25;
    FILE *fp;

    fp=stdin;f=0;

    if (argc>1)
    {
        for(i=1; i<argc;i++)
        {
            if(!strncmp(argv[i],"-n",2))
            {
                page=atoi(&argv[i][2]); 
                if(page<=0)
                    opt_error((char *)argv[ij);
            }
            else
            {
                fp=fopen(argv[i],"r");
                if(!fp) opt_error((char *)argv[i]);
                else f=1;
            }
        }
    }

    Clear_home();
    for(z=0, w=page;;)
    {
        i=fgetc(fp); 
        if(i==EOF)
        {
            if(f) fclose(fp); 
            if(z==0) puts(""); 
            return 0;
        }

        putchar(i); 
        if(i==10) z++;

        if(z>=w-1)
        {
            Z=0;

            Rev_on(); 
            printf("-more-");
            Rev_off();

            t=(int)Bconin(2);
            Clear_line();

            switch(t)
            {
                case 'q': case 'Q': 
                    puts(""); 
                    if(f) fclose(fp); 
                    return 0; 
                case 'f': case 13: w=2;break; 
                default: w=page; break;
            }
        }
    }
}/* main */

Listing 4: Minimales more.ttp


Richard Kurz
Aus: ST-Computer 01 / 1994, Seite 100

Links

Copyright-Bestimmungen: siehe Über diese Seite