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.
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:
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 ...
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 |
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
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
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.
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.
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