POSIX: Das Portable Operating System Interface ist eine gemeinsam vom IEEE und der Open Group für Unix entwickelte standardisierte Programmierschnittstelle, welche die Schnittstelle zwischen Anwendungssoftware und Betriebssystem darstellt. Die internationale Norm trägt die Bezeichnung ISO/IEC/IEEE 9945.
Debian-Almquist-Shell (/bin/dash):
Die Debian-Almquist-Shell (dash) ist POSIX-konform. Im Debian-Projekt ist dash als Standard-Shell /bin/sh für Shell-Skripte eingerichtet, während die aus dem GNU-Projekt stammende Bourne-Again-Shell (bash) mit ihren erweiterten Funktionen im interaktiven Gebrauch (Kommandozeile) bevorzugt wird.
Nachfolgend wird die dash näher beschrieben (gekürzte Übersetzung der Man-Page).
Name
sh - Kommando-Interpreter (Shell)
Syntax
sh [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o option_name] [+o option_name] [command_file [argument …]]
sh -c [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o option_name] [+o option_name] command_string [command_name [argument …]]
sh -s [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o option_name] [+o option_name] [argument …]
Beschreibung
sh ist der Standard Kommando-Interpreter für das System. Die jeweils aktuelle Version von sh passt sich ständig der Konformität zu den POSIX 1003.2 und 1003.2a Spezifikationen für die Shell an.
Überblick
Die Shell ist ein Kommando (Programm) das Zeilen entweder aus einer Datei (Shell-Skript) oder von einem Terminal liest, diese interpretiert, und dann im allgemeinen andere Kommandos ausführt. Es ist das Programm das läuft sobald ein Benutzer sich am System anmeldet.
Aufruf
Ohne Argumente fungiert dash als interaktive Shell.
Mit einem Dateinamen als Argument liest dash Kommandos aus der Datei, interpretiert diese, und führt sie aus.
Mit der Option -c liest dash Kommandos direkt aus dem Kommandozeilen-Parameter.
-a
allexport Exportiert alle zugewiesenen Variablen.
-c
Liest Kommandos von einem Kommando-String an Stelle von Standard Input.
-C
noclobber Überschreibe keine existierenden Dateien bei Dateiumlenkung mit >
.
-e
errexit Besonderes Verhalten bei Auftreten von Fehlern.
-f
noglob Deaktivieren Dateipfad-Erweiterung.
-n
noexec Keine Programm-Ausführung, nur Syntax-Check
-u
nounset Besondere Fehlerbehandlung bei Variablen.
-v
verbose Ausführliche Ausgaben, nützlich beim Debug.
-x
xtrace Gebe alle Kommando vor Ausführung mit vorgesetztem „+“ nach Standard Error (Debug).
-I
ignoreeof Ignoriere EOF's von der Eingabe wenn interaktiv.
-i
interactive Interaktiver Shell-Modus.
-l
Mache dash zur Login-Shell.
-m
monitor Aktiviere Job Control.
-s
stdin Liest Kommandos von Standard Input.
-V
vi Aktiviert den eingebauten vi-kompatiblen Kommandozeilen-Editor.
-E
emacs Aktiviert den eingebauten emacs-kompatiblen Kommandozeilen-Editor.
-b
notify Aktiviert asynchrone Meldungen von Hintergrundprozessen.
Die Shell liest Eingaben zeilenweise ein und zerlegt diese in Wörter und Zwischenraum.
Kontroll-Operatoren:
& && ( ) ; ;; || <newline>
Operatoren für Datei-Umlenkungen:
< > >| « » <& >& «- <>
Begrenzungen:
Backslash (\)
Das nachfolgende Zeichen bekommt eine spezielle Bedeutung.
Einfache Anführungszeichen (‘ ‘):
Eingeschlossene Zeichen stellen eine geschützte Zeichenkette dar, die nicht weiter ausgewertet wird.
Doppelte Anführungszeichen (“ “):
Eingeschlossene Zeichen stellen eine Zeichenkette dar, die u. U. noch weiter ausgewertet wird.
Reservierte Wörter:
! { } case do done elif else esac fi for if then until while
Aliase:
Mit dem eingebauten Kommando alias lassen sich ganze Kommandozeilen neu definieren und so z. B. abkürzen.
Einfache Kommandos:
1. Führende Wörter der Form name=value
werden als Variablenzuweisung interpretiert und beeinflussen die Umgebungsvariablen.
2. Die nachfolgenden Wörter werden als Programm mit Parameterliste interpretiert.
3. Datei-Uumlenkungen.
Datei-Umlenkungen:
File-Descriptoren
0
Standard Eingabe (normalerweise Tastatur)
1
Standard-Ausgabe (normalerweise Bildschirm)
2
Standard-Fehlerausgabe
Es werden Umlenkungen über weitere Descriptoren n = 3, 4, 5, … unterstützt.
[n]> file
Umlenkung Standard-Ausgabe (oder n) in eine Datei.
[n]>| file
das gleiche, überschreibt die Option -C.
[n]» file
Hängt Standard-Ausgabe (oder n) an Datei an.
[n]< file
Umlenkung Standard-Eingabe (oder n) aus einer Datei.
[n1]<&n2
Dupliziere Standard Eingabe (oder n1) von File Descriptor n2.
[n]<&-
Schließe Standard Eingabe (oder n).
[n1]>&n2
Dupliziere Standard Ausgabe (oder n1) nach n2.
[n]>&-
Schließe Standard Ausgabe (oder n).
[n]<> file
Öffne file für Lesen und Schreiben.
[n]« delimiter
here-doc-text … delimiter
macht den gesamten Text bis delimiter an der Standard-Eingabe des Kommandos verfügbar.
Suche und Ausführung
Zuerst wird geprüft, ob ein Kommando einer definierten Shell-Funktion entspricht.
Wird keine definierte Funktion gefunden prüft die Shell auf eingebaute Shell-Kommandos welche ohne separaten Prozess sofort ausgeführt werden.
Enthält das Kommando einen Schrägstrich (/), wird dieses direkt als Dateiname interpretiert und als Prozess ausgeführt.
Wenn all dies fehlschlägt durchsucht die Shell die in der Umgebungsvariablen enthaltenen Verzeichnisse nach dem Programm und führt es als Prozess aus.
Kommando Exit Status
Jedes Kommando liefert bei beenden einen Exit-Status zurück. Exit-Status 0 bedeutet erfolgreiche Ausführung, jeder andere Exit-Status ungleich 0 bedeutet Abbruch durch Fehler.
Pipelines
Das Format für eine Pipeline ist
[!] command1 [| command2 …]
Die Standard-Ausgabe des vorherigen Kommandos ist mit der Standard-Eingabe des folgenden Kommandos verbunden, kann mit Datei-Umlenkung kombiniert werden.
$ command1 2>&1 | command2
Sendet sowohl Standard-Ausgabe als auch Standard-Fehlerausgabe von command1 nach Standard-Eingabe von command2.
Sequenzen, Liste von Kommandos
Ein ; oder <newline> trennt Kommandos voneinander.
Hintergrund-Prozesse
Das Format für das starten eines Kommandos als Hintergrund-Prozess ist:
command1 & [command2 & …]
AND-OR-Sequenzen
command1 && command2
command2 wird nur dann ausgeführt wenn command1 erfolgreich war (Exit-Status = 0)
command1 || command2
command2 wird nur dann ausgeführt wenn command1 nicht erfolgreich war
Komplexe Kommandos
Komplexe Kommandos sind Kombinationen aus einfachen Kommandos mit Kontrolloperatoren oder reservierten Wörtern. Dazu gehören:
Listen, oder zusammengesetzte Listen
zusammengesetzte Kommandos
Funktionsdefinitionen
Solange nicht anders angegeben, entspricht der Exit-Status eines komplexen Kommandos immer dem des letzten ausgeführten einfachen Kommandos von dem Komplexen.
Steuerung des Programmflusses
if-Anweisung
if list
then list
[ elif list
then list ] …
[ else list ]
fi
while-Anweisung
while list
do list
done
Die beiden Listen werden solange wiederholt ausgeführt solange der Exit-Status der ersten Liste 0 ist.
until-Anweisung
until list
do list
done
Die beiden Listen werden solange wiederholt ausgeführt bis der Exit-Status der ersten Liste 0 ergibt.
for-Anweisung
for variable [ in [ word … ] ]
do list
done
break- und continue-Anweisung
break [ num ]
continue [ num ]
Break beendet die num-innerste for- oder while-Schleife. Continue fährt mit dem nächsten Durchlauf der num-innersten Schleife fort
case-Anweisung
case word in
pattern) list ;;
…
esac
Pattern kann mehrere durch „|“ getrennte Werte enthalten.
Anweisungen gruppieren
Anweisungen können gruppiert werden entweder mit
(list)
oder
{ list; }
Die erste Version mit runden Klammern gruppiert Anweisungen und führt diese in einer Subshell aus.
Die zweite Version mit geschweiften Klammern gruppiert Anweisungen und führt diese in der aktuellen Shell aus. Beachte das Semikolon, damit } als Ende der Liste erkannt wird und nicht als Kommandozeilenparameter
Funktionsdefinition:
name () command
Das Kommando ist normalerweise eine in { und } eingeschlossene Liste.
Variablen können in Funktionen lokal deklariert werden
local [variable | -] …
„-“ ist der einzige spezielle Parameter, den man lokal deklarieren kann.
Funktionen können einen Exit-Status zurückgeben.
return [exitstatus]
Variablen und Parameter
Beim starten der Shell werden alle Umgebungsvariablen zu Shell-Variablen. Zusätzlich können neue Variablen deklariert werden.
name=value
Variablennamen dürfen nicht mit einer Ziffer beginnen.
Kommandozeilen-Parameter
Auf die Kommandozeilen-Parameter kann mit $1 … $9
zugegriffen werden.
Spezielle Parameter
$*
Kommandozeilen-Parameter als ein einzelnes Feld
$@
alle Kommandozeilen-Parameter als String-Array
$#
Anzahl der Kommandozeilen-Parameter
$?
Exit-Status des letzten Kommandos
$-
die aktuellen optionalen Flags
$$
Process-ID der Shell
$!
Prozess-ID des letzten Kommandos
$0
Name der Shell oder des Shell-Skripts
Tilde-Erweiterung
~
Benutzer Home-Verzeichnis
Parameter-Erweiterung (Variablen)
${parameter} die einfachste Form der Parameter-Erweiterung, ergibt Variablenwert
${parameter:-word} verwende Parameter, oder verwende Word falls Parameter nicht gesetzt oder Null
${parameter:=word} falls Parameter nicht gesetzt oder Null, setze Parameter=Word
${parameter:?[word]} falls Parameter nicht gesetzt oder Null, beende Shell mit Fehler
${parameter:+word} ergibt Null falls Parameter nicht gesetzt oder Null, ansonsten Word
${#parameter} ergibt Länge des Strings
${parameter%word} entfernt in Parameter kleinst mögliches Suffix aus Word-Muster
${parameter%%word} entfernt in Parameter größt mögliches Suffix aus Word-Muster
${parameter#word} entfernt in Parameter kleinst mögliches Präfix aus Word-Muster
${parameter##word} entfernt in Parameter größt mögliches Präfix aus Word-Muster
Kommando-Substitution
$(command)
ergibt die Ausgabe des Kommandos als Wert
oder
`command`
„Backtick“-Version
Das Kommando wird in einer Subshell ausgeführt.
Arithmetische Erweiterung
$( ( expression ) ) ermöglicht numerische Berechnungen und verwendet Ergebnis
Pfadnamen und andere Shell-Muster
In Pfadnamen und Shell-Muster wie z. B. in case-Anweisung haben „!“, „*“, „?“ und „[„ eine besondere Bedeutung.
* steht für beliebig viele Zeichen
? steht für genau ein einzelnes Zeichen
[abc] eckige Klammern kennzeichnen eine Zeichen-Klasse
! negiert Zeichen oder Zeichen-Klasse
:
true, ein leeres Kommando dass 0 (true) zurück gibt
. file
liest Shell-Skript und führt es in aktueller Shell aus
alias [name[=string …]]
definiert Alias-Name für beliebiges Kommando
bg [job] …
fährt mit der Ausführung im Hintergrund fort
command [-p] [-v] [-V] command [arg …]
ignoriert Shell-Funktion, falls diese gleichen Name wie ein eingebautes Kommando hat
cd -
cd [-LP] [directory]
wechselt aktuelles Arbeitsverzeichnis
echo [-n] args…
gibt Argumente und Sonderzeichen aus
\b
Backspace
\c
unterdrückt nächste Ausgabe
\f
Seitenvorschub
\n
Neue Zeile
\r
Wagenrücklauf
\t
horizontaler Tabulator
\v
vertikaler Tabulator
\0
Null-Zeichen
\0xxx
Zahl in oktaler Schreibweise
\ \ Backslash
eval string
… interpretiert String als Kommando
exec [command arg …]
ersetzt die Shell durch das angegebene Kommando
exit [exitstatus]
beendet Shell-Programm mit Exit-Status
export name …
macht Variablen für aufgerufene Kommandos sichtbar
export -p
listet exportierte Variablen auf
export name=value
Zuweisung und exportieren kombinieren
HISTSIZE
Anzahl der verfügbaren früher ausgeführten Kommandos
fg [job]
versetzt Programm in den Vordergrundprozess
getopts optstring var
ermöglicht komplexe Auswertung von Kommandozeilen-Parameter
hash -rv command …
findet installierte Kommandos
pwd [-LP]
gibt aktuelles Arbeitsverzeichnis aus
read [-p prompt] [-r] variable […]
Weist Variablen Werte aus Standard-Eingabe zu.
readonly name …
schützt Variablen vor dem Überschreiben
readonly -p
listet schreibgeschützte Variablen auf
readonly name=value
kombiniert Zuweisung und Schreibschutz
printf format [arguments …]
gibt Argumente und Sonderzeichen formatiert aus
\a
Bell-Zeichen
\b
Backspace
\f
Seitenvorschub
\n
Neue Zeile
\r
Wagenrücklauf
\t
horizontaler Tabulator
\v
vertikaler Tabulator
\ \ Backslash
\num
8-Bit Zeichen mit ASCII-Wert in oktaler Schreibweise
set [{ -options | +options | – }] arg …
listet alle Shell-Variablen mit Werte auf, ändert Shell-Optionen, oder ersetzt Kommandozeilen-Parameter.
shift [n]
verschiebt Kommandozeilen-Parameter um n Stellen nach links
test expression
Vergleichsausdrücke
oder
[ expression ]
-b
file wahr wenn file existiert und eine spezielle Blockdatei ist
-c
file wahr wenn file existiert und eine spezielle Zeichenorientierte Datei ist
-d
file wahr wenn file existiert und ein Verzeichnis ist
-e
file wahr wenn file existiert (unabhängig vom Typ)
-f
file wahr wenn file existiert und eine normale Datei ist
-g
file wahr wenn file existiert und sein Group ID Flag gesetzt ist
-h
file wahr wenn file existiert und ein symbolischer Link ist
-k
file wahr wenn file existiert und sein Sticky Bit gesetzt ist
-n
string wahr wenn String existiert (Länge größer 0)
-p
file wahr wenn file eine benannte Pipe ist
-r
file wahr wenn file existiert und lesbar ist
-s
file wahr wenn file existiert und eine Größe größer 0 hat
-t
file_descriptor wahr wenn angegebener File-Deskriptor mit einem Terminal verbunden ist
-u
file wahr wenn file existiert und sein User ID Flag gesetzt ist
-w
file wahr wenn file existiert und beschreibbar ist
-x
file wahr wenn file existiert und ausführbar ist
-z
string wahr wenn String leer ist
-L
file wahr wenn file existiert und ein symbolischer Link ist
-O
file wahr wenn file existiert und angemeldeter User der Eigentümer ist
-G
file wahr wenn file existiert und angemeldeter User Gruppenmitglied ist
-S
file wahr wenn file existiert und ein Socket ist
file1 -nt file2
wahr wenn file1 neuer als file2 ist und beide existieren
file1 -ot file2
wahr wenn file1 älter als file2 ist und beide existieren
file1 -ef file2
wahr wenn beide Dateien existieren und auf die gleiche Datei verweisen
string
wahr wenn String nicht leer ist
s1 = s2
wahr wenn s1 und s2 identische Strings sind
s1 != s2
wahr wenn s1 und s2 nicht identisch sind
s1 < s2
wahr wenn s1 alphabetisch vor s2 kommt
s1 > s2
wahr wenn s1 alphabetisch nach s2 kommt
n1 -eq n2
wahr wenn n1 und n2 numerisch gleich sind
n1 -ne n2
wahr wenn n1 und n2 numerisch ungleich sind
n1 -gt n2
wahr wenn n1 > n2 ist
n1 -ge n2
wahr wenn n1 >= n2 ist
n1 -lt n2
wahr wenn n1 < n2 ist
n1 -le n2
wahr wenn n1 ⇐ n2 ist
! expression
Logische Negierung
expression1 -a expression2
Logisch UND
expression1 -o expression2
Logisch ODER
(expression)
Logische Klammerung
times
gibt die Nutzungsdauer der Shell aus
trap [action signal …]
Auswertung von (Unterbrechungs-)Signale an den Prozess
type [name …]
sucht Kommandos und gibt gefundene Pfadnamen aus
ulimit [-H | -S] [-a | -tfdscmlpn [value]]
setzt Grenzen oder gibt gesetzte Werte aus
-H
Hard Limits
-S
Soft Limits
-a
gibt alle Werte aus
-t
CPU-Zeit in Sekunden
-f
größtmögliche Datei in 512-Byte Blöcke
-d
Data Segment Größe eines Prozesses in kB
-s
Stack Größe eines Prozesses in kB
-c
größtmöglicher Core Dump in 512-Byte Blöcke
-m
von einem Prozess nutzbarer Arbeitsspeicher in kB
-l
Speicher in kB der von einem Prozess blockiert werden kann
-p
Anzahl parallel laufender Prozesse je Benutzer
-n
Anzahl gleichzeitig geöffneter Dateien eines Prozesses
umask [mask]
Maske für Zugriffsrechte neu erzeugter Dateien
unalias [-a] [name]
entfernt Alias-Namen
unset [-fv] name …
löscht Variablen
wait [job]
wartet bis parallel laufende Prozesse abgearbeitet sind
Umgebungsvariablen:
HOME
Home-Verzeichnis des angemeldeten Benutzers
PATH
Suchpfad für ausführbare Kommandos
CDPATH
Suchpfad für eingebautes cd-Kommando
MAIL
auf neue Mails zu überprüfende Mail-Datei
MAILCHECK
Anzahl Sekunden nach der auf neue Mails geprüft wird
MAILPATH
Suchpfad für Mail-Dateien
PS1
Primärer Prompt, normalerweise „$“ für Benutzer oder „#“ für Root
PS2
Sekundärer Prompt, normalerweise „>„
PS4
Zeilenmarkierung für Ausgaben, normalerweise “+„
IFS
Trennzeichen für Eingabedaten
TERM
Name der Shell
HISTSIZE
Anzahl der Zeilen der gepufferten Kommandos der Shell
PWD
enthält aktuelles Arbeitsverzeichnis
OLDPWD
enthält das vorherige Arbeitsverzeichnis vor dem cd-Kommando
PPID
enthält die Prozess-ID des Programms, welches die Shell gestartet hatte