Was ist sh
sh
(oder die Shell-Befehlssprache) ist eine Programmiersprache, die vom POSIX-Standard beschrieben wird . Es hat viele Implementierungen ( ksh88
, dash
, ...). bash
kann auch als Implementierung von betrachtet werden sh
(siehe unten).
Da sh
es sich bei einer Spezifikation und nicht um eine Implementierung handelt, /bin/sh
handelt es sich um einen Symlink (oder einen Hardlink) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.
Was ist Bash?
bash
Es wurde als sh
kompatible Implementierung gestartet (obwohl es einige Jahre vor dem POSIX-Standard liegt), hat aber im Laufe der Zeit viele Erweiterungen erhalten. Viele dieser Erweiterungen können das Verhalten gültiger POSIX-Shell-Skripte ändern, sodass sie für sich genommen bash
keine gültige POSIX-Shell sind. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.
bash
unterstützt einen --posix
Switch, wodurch er POSIX-kompatibler wird. Es wird auch versucht, POSIX nachzuahmen, wenn es als aufgerufen wird sh
.
sh = bash?
Lange Zeit /bin/sh
verwendet, um /bin/bash
auf den meisten GNU / Linux-Systemen zu verweisen . Infolgedessen war es fast sicher geworden, den Unterschied zwischen den beiden zu ignorieren. Aber das hat sich in letzter Zeit geändert.
Einige beliebte Beispiele für Systeme, auf /bin/sh
die nicht hingewiesen wird /bin/bash
(und auf denen einige /bin/bash
möglicherweise gar nicht existieren), sind:
- Modernes Debian und Ubuntu - Systeme, die ein symbolischer Link
sh
zu dash
standardmäßig;
- Busybox , die normalerweise während der Startzeit des Linux-Systems als Teil von ausgeführt wird
initramfs
. Es verwendet die ash
Shell-Implementierung.
- BSDs und im Allgemeinen alle Nicht-Linux-Systeme. OpenBSD verwendet
pdksh
einen Nachkommen der Korn-Shell. FreeBSDs sh
ist ein Nachkomme der ursprünglichen UNIX Bourne-Shell. Solaris hat eine eigene, sh
die lange Zeit nicht POSIX-konform war. Eine kostenlose Implementierung ist im Heirloom-Projekt verfügbar .
Wie können Sie herausfinden, auf welche /bin/sh
Punkte auf Ihrem System verwiesen wird?
Die Komplikation ist, dass es /bin/sh
sich um eine symbolische oder eine harte Verbindung handeln kann. Wenn es sich um eine symbolische Verbindung handelt, können Sie sie auf tragbare Weise beheben:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Wenn es eine harte Verbindung ist, versuchen Sie es
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
Tatsächlich -L
deckt das Flag sowohl Symlinks als auch Hardlinks ab. Der Nachteil dieser Methode ist jedoch, dass sie nicht portierbar ist. POSIX muss find
die -samefile
Option nicht unterstützen , obwohl sowohl GNU find als auch FreeBSD find sie unterstützen.
Shebang Linie
Letztendlich liegt es an Ihnen, zu entscheiden, welche Sie verwenden möchten, indem Sie die Zeile «shebang» als allererste Zeile des Skripts schreiben.
Z.B
#!/bin/sh
wird verwenden sh
(und was auch immer das passiert, um darauf hinzuweisen),
#!/bin/bash
wird verwendet, /bin/bash
wenn es verfügbar ist (und schlägt mit einer Fehlermeldung fehl, wenn dies nicht der Fall ist). Natürlich können Sie auch eine andere Implementierung angeben, z
#!/bin/dash
Welches zu verwenden
Für meine eigenen Skripte bevorzuge ich sh
aus folgenden Gründen:
- es ist standardisiert
- es ist viel einfacher und leichter zu lernen
- Es ist portabel für alle POSIX-Systeme - auch wenn sie es nicht haben
bash
, müssen sie es habensh
Die Verwendung bietet ebenfalls Vorteile bash
. Seine Funktionen machen das Programmieren bequemer und ähneln dem Programmieren in anderen modernen Programmiersprachen. Dazu gehören beispielsweise lokale Variablen und Arrays mit Gültigkeitsbereich. Plain sh
ist eine sehr minimalistische Programmiersprache.