Was ist sh
sh(oder die Shell-Befehlssprache) ist eine Programmiersprache, die vom POSIX-Standard beschrieben wird . Es hat viele Implementierungen ( ksh88, dash, ...). bashkann auch als Implementierung von betrachtet werden sh(siehe unten).
Da shes sich bei einer Spezifikation und nicht um eine Implementierung handelt, /bin/shhandelt es sich um einen Symlink (oder einen Hardlink) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.
Was ist Bash?
bashEs wurde als shkompatible 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 bashkeine gültige POSIX-Shell sind. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.
bashunterstützt einen --posixSwitch, wodurch er POSIX-kompatibler wird. Es wird auch versucht, POSIX nachzuahmen, wenn es als aufgerufen wird sh.
sh = bash?
Lange Zeit /bin/shverwendet, um /bin/bashauf 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/shdie nicht hingewiesen wird /bin/bash(und auf denen einige /bin/bashmöglicherweise gar nicht existieren), sind:
- Modernes Debian und Ubuntu - Systeme, die ein symbolischer Link
shzu dashstandardmäßig;
- Busybox , die normalerweise während der Startzeit des Linux-Systems als Teil von ausgeführt wird
initramfs. Es verwendet die ashShell-Implementierung.
- BSDs und im Allgemeinen alle Nicht-Linux-Systeme. OpenBSD verwendet
pdksheinen Nachkommen der Korn-Shell. FreeBSDs shist ein Nachkomme der ursprünglichen UNIX Bourne-Shell. Solaris hat eine eigene, shdie lange Zeit nicht POSIX-konform war. Eine kostenlose Implementierung ist im Heirloom-Projekt verfügbar .
Wie können Sie herausfinden, auf welche /bin/shPunkte auf Ihrem System verwiesen wird?
Die Komplikation ist, dass es /bin/shsich 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 -Ldeckt das Flag sowohl Symlinks als auch Hardlinks ab. Der Nachteil dieser Methode ist jedoch, dass sie nicht portierbar ist. POSIX muss find die -samefileOption 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/bashwenn 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 shaus 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 shist eine sehr minimalistische Programmiersprache.