# AmigaDOS

AmigaDOS ist das Festplatten-Betriebssystem des AmigaOS, welches die Dateisysteme, Datei- und Verzeichnismanipulation, die Kommandozeilenschnittstelle (CLI) (später in Shell umbenannt) und Dateiumleitung beinhaltet.
In AmigaOS 1.x basiert AmigaDOS auf einer TRIPOS-Portierung von MetaComCo, geschrieben in BCPL. BCPL verwendet keine nativen Zeiger, sodass die fortgeschrittenen Funktionen des Betriebssystems schwierig zu benutzen und fehleranfällig waren. Das AmigaDOS Resource Project (ARP, früher AmigaDOS Replacement Project), ein Projekt, das vom Amiga-Entwickler Charlie Heath begonnen wurde, ersetzte viele der BCPL-Dienstprogramme durch kleinere, ausgefeiltere Äquivalente, die in C und Assembler geschrieben wurden, und stellte eine Wrapper-Bibliothek, die arp.library, zur Verfügung. Diese beseitigte die Schnittstellenprobleme in Anwendungen, indem sie automatisch Konvertierungen von nativen Zeigern (wie sie von C oder Assembler verwendet werden) in BCPL-Äquivalente und umgekehrt für alle AmigaDOS-Funktionen durchführte. Ab AmigaOS 2.x wurde AmigaDOS in C umgeschrieben, wobei die 1.x-Kompatibilität so weit als möglich beibehalten wurde.
Beginnend mit AmigaOS 4.0 gab AmigaDOS sein BCPL Erbe auf. Ab AmigaOS 4.1 wurde AmigaDOS um die Unterstützung von 64-Bit-Dateizugriff erweitert.

## Dateisysteme

AmigaDOS unterstützt verschiedene Dateisysteme und Varianten. Das erste Dateisystem wurde einfach Amiga Dateisystem genannt und war hauptsächlich für Disketten geeignet, da es kein automatisches Booten von Festplatten unterstützte. Auf Disketten wurde das Booten mit Code aus dem Bootblock durchgeführt.
Es wurde bald durch das FastFileSystem (FFS) ersetzt, weshalb das ursprüngliche Dateisystem nachträglich den Namen Old FileSystem (OFS) erhielt. FFS war platzsparender und messbar schneller als OFS. Mit AmigaOS 2.x wurde FFS ein offizieller Teil des Betriebssystems und wurde bald erweitert, um zwischenspeichernde Partitionen zu erkennen, später dann internationale Partitionen mit akzentuierten Zeichen in Datei- und Partitionsnamen, und schließlich mit MorphOS und AmigaOS 4 lange Dateinamen mit bis zu 108 Zeichen (ursprünglich 31).
Sowohl AmigaOS 4.x als auch MorphOS enthielten eine weiterentwickelte Version von FFS namens FastFileSystem 2. FFS2 enthielt alle Funktionen des ursprünglichen FFS. Um die Rückwärtskompatibilität zu wahren, gab es keine größeren strukturellen Änderungen. Allerdings unterscheidet sich FFS2 auf AmigaOS 4.1 dadurch, dass seine Funktionen durch Plug-ins erweitert werden können.
Wie bei FFS2 ist die AmigaOS 4 und MorphOS Version von Smart FileSystem ein Fork des originalen SFS und nicht 100 % kompatibel mit diesem.
Andere Dateisysteme wie FAT12, FAT16, FAT32 von Windows oder ext2 von Linux sind über einfach zu installierende Systembibliotheken (Drag & Drop) oder Module von Drittanbietern wie FAT95 (mit Lese-/Schreibunterstützung) verfügbar (zu finden im Aminet-Software-Repository). MorphOS 2 hat die Unterstützung für FAT-Dateisysteme bereits inkludiert. AmigaOS 4.1 hat ein neues Dateisystem namens JXFS eingeführt, das Partitionen > 1 Terabyte adressieren kann.
Zu den alternativen Dateisystemen für AmigaOS von Drittherstellern gehören das Professional File System, ein Dateisystem mit einer einfachen, auf Metadaten basierenden Struktur, das eine hohe interne Kohärenz ermöglicht, in der Lage ist, sich selbst zu defragmentieren und nicht ausgehängt werden muss, bevor es wieder eingehängt wird, und das Smart File System, ein Journaling-Dateisystem, das während der Inaktivität des Systems Journaling-Aktivitäten ausführt und von MorphOS als Standard-Dateisystem genutzt wird.

### Offizielle Varianten der Amiga Dateisysteme
#### Old File System / Fast File System

    OFS (DOS0)
    FFS (DOS1)
    OFS International (DOS2)
    FFS International (DOS3)
    OFS Verzeichnis Caching (DOS4)
    FFS Verzeichnis Caching (DOS5)

#### Fast File System 2 (AmigaOS4.x / MorphOS)

    OFS Lange Dateinamen (DOS6)
    FFS Lange Dateinamen (DOS7)
Sowohl DOS6 als auch DOS7 bieten internationale Dateinamen wie in DOS2 und DOS3, nicht aber Verzeichnis Caching, das aufgrund von Fehlern in der ursprünglichen Implementierung aufgegeben wurde. Die Verwendung von DOS4 und DOS5 wird aus diesem Grund nicht empfohlen.
Die DOStypen sind untereinander abwärtskompatibel, aber nicht aufwärtskompatibel. Eine DOS7-formatierte Diskette kann nicht auf einem originalen Amiga FFS gelesen werden, und eine DOS3-Diskette kann nicht auf einem Kickstart 1.3-Amiga gelesen werden. Jedoch kann jede mit DOS0 formatierte Diskette mit FFS oder FFS2 von jeder Version des Amiga-Betriebssystems gelesen werden.
Aus diesem Grund war DOS0 tendenziell das bevorzugte Format von Softwareentwicklern, die ihre Software auf Diskette vertrieben. Nur bei Amiga-Spielen war es eine gängige Praxis, aus Kopierschutzgründen ein eigenes Dateisystem und einen eigenen Bootblock zu verwenden. Und wenn die Software ohnehin AmigaOS 2.x benötigte, wurde im Allgemeinen DOS3 verwendet.

### FastFileSystem2-Plug-ins

Mit dem Update von AmigaOS 4.0 im Juli 2007 wurden auch zwei Plug-ins für FFS2 veröffentlicht:
* fs_plugin_cache: erhöht die Leistung von FFS2 durch Einführung einer neuen Methode zur Datenpufferung.
* fs_plugin_encrypt: Datenverschlüsselungs-Plug-in für Partitionen unter Verwendung des Blowfish-Algorithmus.

## Konsole

Die Amiga-Konsole ist ein virtuelles Standard-Amiga-Gerät, das normalerweise CON: zugewiesen ist und via console.handler gesteuert wird. Sie wurde aus einer primitiven Schnittstelle in AmigaOS 1.1 entwickelt und wurde mit den Versionen 1.2 und 1.3 stabil, als sie als AmigaShell bekannt wurde, und ihr ursprünglicher Handler durch den newconsole.handler (NEWCON:) ersetzt wurde.
Die Konsole hat verschiedene Funktionen, die 1985 als aktuell angesehen wurden, wie Befehlsvorlagenhilfe, Umleitung auf Null (NIL:) und ANSI-Farbterminal. Der in Version 1.2 neu implementierte Konsolen-Handler ermöglicht viele weitere Funktionen, wie z. B. Befehlshistorie, Pipelines und automatische Erstellung von Dateien, wenn die Ausgabe umgeleitet wird. Als TCP/IP-Stacks wie AmiTCP in den frühen 1990er Jahren veröffentlicht wurden, konnte die Konsole auch Umleitungen von Internet-fähigen Amiga-Geräte-Handlern empfangen (z. B. TCP:, copy file TO TCP:Site/Port).
Im Gegensatz zu anderen Systemen, die Mitte der 1980er Jahre auf den Markt kamen, implementiert AmigaDOS keinen proprietären Zeichensatz. Die Entwickler entschieden sich vielmehr für den ANSI-ISO-Standard ISO-8859-1 (Latin 1), der den ASCII-Zeichensatz enthält. Wie in Unix-Systemen akzeptiert die Amiga-Konsole nur den Zeilenvorschub (LF) als Zeilenendezeichen (EOL). Die Amiga-Konsole unterstützt sowohl Akzentzeichen als auch Zeichen, die durch Kombinationen von „toten (unbelegten) Tasten“ auf der Tastatur erzeugt werden können.

## Namenskonventionen
### Groß- und Kleinschreibung

AmigaDOS unterscheidet im Allgemeinen nicht zwischen Groß- und Kleinschreibung. Die Angabe eines Geräts als Dh0:, DH0: oder dh0: bezieht sich immer auf dieselbe Partition.
Bei Datei- und Verzeichnisnamen ist dies jedoch vom Dateisystem abhängig, da einige Dateisysteme Groß- und Kleinschreibung als Flag bei der Formatierung erlauben. Ein Beispiel für ein solches Dateisystem ist das Smart File System. Dies ist praktisch, wenn es um Software geht, die aus der Unix-Welt mit Groß- und Kleinschreibung portiert wurde, verursacht aber bei nativen Amiga-Anwendungen, die die Groß- und Kleinschreibung nicht beachten, viel Verwirrung.
Fortgeschrittene Benutzer werden daher typischerweise das Groß-/Kleinschreibungs-Flag nur für Dateisysteme verwenden, die für Software verwendet werden, die aus Unix stammt. Das Umbenennen von Datei-, Verzeichnis- und Datenträgernamen ist mit gewöhnlichen Methoden erlaubt. Die Befehle rename foo Foo und relabel Bar: bAr: sind gültig und tun genau das, was erwartet wird; im Gegensatz zu Linux, wo mv foo Foo auf Dateisystemen wie VFAT, die Groß-/Kleinschreibung nicht berücksichtigen, zu der Fehlermeldung mv: `foo' and `Foo' are the same file führt.

### Namenskonventionen für Datenträger

Partitionen und physische Laufwerke werden üblicherweise als DF0: (Diskettenlaufwerk 0), DH0: (Festplatte 0) usw. bezeichnet. Im Gegensatz zu vielen Betriebssystemen sind jedoch die Namen der einzelnen Datenträger und Partitionen außerhalb der eingebauten physischen Hardware wie DF0: oder DH0: völlig willkürlich.
So könnte eine Festplattenpartition zum Beispiel „Workbench“ oder „System“ heißen. Die Nutzer können dann anstelle des Gerätenamens auch den Namen des Datenträgers verwenden, so dass auf eine Festplattenpartition auf dem Gerät DH0: namens Workbench entweder mit dem Namen DH0: oder Workbench: zugegriffen werden kann. Die Nutzer müssen nur dem System mitteilen, dass mit „Workbench“ der Datenträger Workbench: gemeint ist, indem sie den Doppelpunkt „:“ hinter dem Namen eingeben, wenn sie dies in einer Systemabfrage oder in der AmigaShell eingeben. Dieses Prinzip funktioniert mit allen Arten von Datenträgern.
Kann ein Datenträger mit dem angegebenen Namen nicht gefunden werden, fordert das Betriebssystem den Nutzer auf, das Medium mit dem angegebenen Datenträgernamen einzulegen bzw. anzuschließen oder erlaubt dem Nutzer, den Vorgang abzubrechen.
Darüber hinaus können mit dem Befehl assign logische Gerätenamen einem beliebigen Verzeichnis oder Gerät zugewiesen werden. So weisen Programme weisen ihrem Installationsverzeichnis häufig einen virtuellen Datenträgernamen zu. Ein fiktives Textverarbeitungsprogramm namens Textor könnte beispielsweise den Datenträgernamen Textor: dem Verzeichnis DH0:Arbeit/Textor zuweisen. Dies ermöglicht ein einfaches Verschieben von installierten Programmen:
In AmigaDOS sind verschiedene Standardnamen für Verweise auf wichtige Systemorte vorgesehen, wie zum Beispiel SYS: für den Datenträger, von dem das System gestartet wurde, S: für Startup-Skripte, C: für AmigaDOS-Befehle, FONTS: für installierte Schriftarten etc.
Die Zuordnung von Datenträgerbezeichnungen kann auch für mehrere Verzeichnisse festgelegt werden, die dann als eine Vereinigung ihrer Inhalte behandelt werden. Zum Beispiel könnte FONTS: dem Verzeichnis SYS:Fonts zugewiesen werden und dann mit der add-Option des AmigaDos-Befehls assign auf z. B. Arbeit:MeineFonts erweitert werden.
Damit können alle Schriftarten verwendet werden, die in einem der beiden Verzeichnisse installiert sind. Die Auflistung von FONTS: würde die Dateien aus beiden Verzeichnissen anzeigen.

### Dateinamenserweiterungen

AmigaDOS hat nur eine einzige vorgeschriebene Dateinamenserweiterung: .info, die an den Dateinamen eines jeden Icons angehängt werden muss.
Wenn eine Datei namens meinprogramm existiert, dann muss ihre Icon-Datei meinprogramm.info heißen. Zusätzlich zu den Bilddaten speichert die Icon-Datei auch Programm-Metadaten wie Optionen und Schlüsselwörter, ihre eigene Position auf dem Desktop (AmigaOS kann Icons an vom Benutzer definierten Stellen „einfangen“) und andere Informationen über die Datei. Informationen über die Größe und Position des Verzeichnisfensters werden in der .info-Datei gespeichert, die dem Verzeichnis zugeordnet ist, und Informationen über Festplattensymbole werden in der Disk.info im Stammverzeichnis des Datenträgers gespeichert.
Mit Ausnahme von Icons identifiziert das Amiga-System Dateitypen nicht anhand von Namenserweiterungen, sondern untersucht entweder das einer Datei zugeordnete Icon oder den binären Header der Datei selbst, um den Dateityp zu bestimmen.

### Typisches Verhalten von virtuellen Geräten

Das physische Gerät DF0: teilt sich die gleiche Diskettenlaufwerksmechanik mit PC0:, dem virtuellen CrossDOS-Gerät, das PC-formatierte Disketten lesen kann.
Wenn eine PC-formatierte Diskette in das Diskettenlaufwerk eingelegt wird, ändert sich das DF0: Disketten-Amiga-Symbol, um anzuzeigen, dass die Diskette dem normalen Amiga-Gerät unbekannt ist, und es zeigt vier Fragezeichen ???? als den standardmäßigen „unbekannten“ Datenträgernamen an, während das PC0: Symbol erscheint und den Namen der PC-formatierten Diskette preisgibt.
Jeder Diskettenwechsel mit Amiga-formatierten Disketten wird dieses Verhalten umkehren.

## Syntax der AmigaDOS-Befehle

Dies ist ein Syntax-Beispiel für einen typischen AmigaDOS-Befehl:
    Ohne in den Verzeichnisbaum zu springen, zeigt dies den Inhalt eines Verzeichnisses auf einer Diskette und listet auch Unterverzeichnisse auf:
    Das Argument ALL bewirkt, dass der Befehl den gesamten Inhalt eines Datenträgers oder Geräts anzeigt, wobei alle Verzeichnisbäume eingegeben und erweitert werden. SYS: ist ein Standardname, der dem Boot-Gerät zugewiesen wird, unabhängig von seinem physischen Namen.

### Weiterleitung von Befehlen

AmigaDOS kann die Ausgabe eines Befehls auf Dateien, Pipes, einen Drucker, das Nullgerät und andere Amiga-Geräte umleiten.
    Leitet die Ausgabe von dir an den Sprachsynthese-Handler weiter. Das Doppelpunkt-Zeichen : zeigt an, dass SPEAK: auf ein AmigaDOS-Gerät verweist. Neben der typischen Verwendung mit Dateisystemen können auch spezielle Gerätenamen wie dieser in AmigaDOS verwendet werden.

### Befehlsschema

Von AmigaDOS-Befehlen wird erwartet, dass sie einem bestimmten Schema folgen, welches von den akzeptierten Argumenten beschrieben wird. Dieses Schema kann über eine Hilfefunktion (Parameter ?) abgefragt werden. Jedoch bieten alternative Konsolen und Shells von Drittanbietern wie Bash oder Zshell (portiert von Unix) oder KingCON oft eine ausführlichere Hilfe für eingebaute Befehle.
    Dieser String bedeutet, dass der Benutzer diesen Befehl in Verbindung mit den Argumenten FROM und TO verwenden muss, wobei das letztere obligatorisch (/A) ist. Die Argumente ALL und QUIET sind Schalter (/S) und ändern die Ergebnisse des Copy Befehls. ALL bewirkt, dass alle Dateien in das benannte Verzeichnis kopiert werden, während mittels QUIET der Befehl ohne Rückmeldung ausgeführt wird.
Nachfolgend ein Beispiel für den praktischen Einsatz:

### Unterbrechen von Befehlen und Pausieren der Konsolenausgabe

Die Ausführung eines Befehls kann mit den Tastenkombinationen Strg+C oder Strg+D abgebrochen werden. Durch Drücken der Leertaste oder eines beliebigen anderen Zeichens auf der Tastatur wird die Ausgabe in der Konsole angehalten. Die Ausgabe kann fortgesetzt werden, indem man die Rücktaste (← Backspace) drückt, wobei die gesamte bisherige Ausgabe gelöscht wird, oder indem man die Eingabetaste (↵ Enter) drückt, um die Eingabe als Befehl zu bestätigen, sobald der aktuelle Befehl abgeschlossen ist.

### Wildcard-Zeichen

Wie andere Betriebssysteme bietet auch AmigaDOS Wildcard-Zeichen, die ein beliebiges Zeichen oder eine beliebige Folge von Zeichen in einer Zeichenkette ersetzen. Hier ist ein Beispiel für die Nutzung solcher Platzhalterzeichen in AmigaDOS-Befehlen:
    durchsucht das aktuelle Verzeichnis nach allen Dateien, die als Suffix .info am Ende enthalten, und zeigt nur diese Dateien in der Ausgabe an.
Dies wird wie folgt geparst:
Der Platzhalter ? bedeutet "beliebiges Zeichen". Wird dem Platzhalter ein # vorangestellt, bedeutet dies "beliebige Anzahl von Wiederholungen". Dies kann als Analogie zum regulären Ausdruck .* betrachtet werden.

## Skript-Programmierung

Auch in AmigaDOS besteht die Möglichkeit der Batch-Programmierung. So gibt es eine Reihe von Befehlen wie Echo, If, Then, EndIf, Val und Skip, um strukturierte Skripte zu programmieren.
Skripte sind textbasierte Dateien und können mit dem AmigaDOS-internen Texteditor Ed (nicht verwandt mit dem Unix-Ed) oder mit jedem anderen Texteditor eines Drittanbieters erstellt werden. Um ein Skriptprogramm zu starten, verwendet AmigaDOS den Befehl Execute.
    Hierdurch wird das Skript "meinskript" ausgeführt.
    Wie zuvor, jedoch startet der AmigaDOS-Befehl Run jeden DOS-Befehl (oder jede andere Art von Programm) asynchron in einem neuen, separaten Prozess. Dadurch wird die Konsole nicht blockiert, sondern bleibt für weitere Eingaben frei.

### Schutzbits

Über Schutzbits können verschiedene Berechtigungen für Dateien, Links und Verzeichnisse im Dateisystem gesetzt werden.
Um sie zu ändern, kann man entweder den Befehl Protect verwenden oder über den Eintrag Information aus dem Workbench-Menü Icons auf die ausgewählten Dateien anwenden. AmigaDOS unterstützt den folgenden Satz von Schutzbits (abgekürzt HSPARWED):

#### H = Hold

    Befehle mit gesetztem P-Bit werden bei der ersten Ausführung automatisch resident.
    Damit dies funktioniert, müssen die Bits E, P und R gesetzt sein.

#### S = Skript

    Kennzeichnet eine Batch-Datei. Für die volle Funktionsfähigkeit muss jeweils das E- und R-Bit gesetzt sein.
    Ist dieses Schutzbit gesetzt, kann AmigaDOS ein Skript erkennen und automatisch ausführen, indem es einfach seinen Namen aufruft. Ohne das S-Bit können Skripte nur via Execute-Befehl gestartet werden.

#### P = Pure

    kennzeichnet reentrante Befehle, die im RAM resident gemacht werden können, wodurch diese nicht mehr zur Laufzeit von Flash-Laufwerken, Festplatten oder anderen Medien geladen werden müssen.

#### A = Archive

    Archiv-Bit, das von Sicherungsprogrammen verwendet wird, um anzuzeigen, dass eine Datei gesichert wurde

#### R = Read

    Berechtigung, die Datei, den Link oder den Inhalt eines Verzeichnisses zu lesen

#### W = Write

    Berechtigung, die Datei, den Link oder den Inhalt eines Verzeichnisses zu schreiben

#### E = Execute

    Berechtigung, die Datei ausführen oder das Verzeichnis lesen zu können

#### D = Delete

    Berechtigung, die Datei, den Link oder das Verzeichnis zu löschen
Das H-Bit wird oft als „Verstecken“ (englisch Hide) missverstanden. Nur im Smart File System (SFS) sind Dateien und Verzeichnisse mit gesetztem H-Bit vor dem System versteckt. Der Zugriff auf versteckte Dateien ist zwar weiterhin möglich, aber sie erscheinen nicht in den Verzeichnislisten.
Demonstration des H-Bits in Aktion:
    Es ist zu beachten, dass der List-Befehl nach der Ausführung resident wird, wenn das H-Bit gesetzt ist.

### Globale und lokale Variablen

Wie jedes andere DOS arbeitet auch der Amiga in der Batch-Programmierung mit Umgebungsvariablen.
Es gibt sowohl globale als auch lokale Variablen, die mit einem Dollarzeichen vor dem Variablennamen bezeichnet werden, zum Beispiel $myvar. Globale Variablen sind systemweit verfügbar; lokale Variablen sind nur in der aktuellen Shell gültig. Im Falle einer Namenskollision haben lokale Variablen Vorrang vor globalen Variablen.
Globale Variablen können mit dem Befehl SetEnv gesetzt werden, während lokale Variablen mit dem Befehl Set gesetzt werden können. Es gibt auch die Befehle GetEnv und Get, mit denen globale und lokale Variablen ausgegeben werden können.
Die folgenden Beispiele zeigen die einfache Verwendung:
    Wird das save-Flag des SetEnv-Befehls gesetzt, wird diese Variable dauerhaft in ENVARC: gespeichert und bleibt auch nach dem Beenden der aktuellen Sitzung oder nach einem Neustart des Systems verfügbar.
Globale Variablen werden als Dateien virtuell in ENV: und optional auf der Festplatte in ENVARC: gespeichert, um einen Neustart und ein Ausschalten zu überstehen. ENV: ist standardmäßig RAM:Env zugewiesen, und ENVARC: ist SYS:Prefs/Env-archive zugewiesen, wobei SYS: sich auf das Boot-Gerät bezieht. Beim Booten wird der Inhalt von ENVARC: nach ENV: kopiert, damit man darauf zugreifen kann.
Bei der Programmierung von AmigaDOS-Skripten ist zu beachten, dass globale Variablen systemweit sind. Alle skriptinternen Variablen müssen als lokalen Variablen gesetzt werden, da es sonst zu Konflikten mit globalen Variablen kommen kann. Außerdem erfordern globale Variablen einen Zugriff auf das Dateisystem, was sie in der Regel langsamer macht als lokale Variablen.
Da ENVARC: auch dazu verwendet wird, andere Systemeinstellungen als nur String-Variablen zu speichern (z. Bsp. Systemeinstellungen, Standardsymbole usw.), kann es mit der Zeit sehr groß werden. Da auf Classic Amigas Speicher nur begrenzt verfügbar ist, kann das Kopieren aller Dateien nach ENV: auf die RAM-Disk zu einer Belastung für das System werden. Dies hat zur Programmierung von alternativen Ramdisk-Handlern geführt. Diese kopieren die Dateien nur dann von ENVARC: nach ENV:, wenn sie angefordert werden.
Die AmigaDOS-Befehle Lab und Skip ermöglichen in Verbindung mit der kreativen Nutzung globaler Variablen eine Art Sprungbefehl, der dem bekannten GOTO aus anderen Programmiersprachen ähnelt und zur Steuerung des Programmflusses dient.