Was ist sh
sh
(oder die Shell Command Language) ist eine Programmiersprache, die vom POSIX-Standard beschrieben wird . Es hat viele Implementierungen ( ksh88
, dash
, ...). bash
kann auch als Implementierung von sh
(siehe unten) betrachtet werden.
Da sh
es sich um eine Spezifikation handelt, nicht um eine Implementierung, /bin/sh
handelt es sich um einen Symlink (oder einen festen Link) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.
Was ist Bash?
bash
sh
Begonnen als -kompatible Implementierung (obwohl sie einige Jahre älter ist als der POSIX-Standard), hat sie im Laufe der Zeit jedoch viele Erweiterungen erhalten. Viele dieser Erweiterungen können das Verhalten gültiger POSIX-Shell-Skripte ändern, sodass es sich bash
nicht um eine gültige POSIX-Shell handelt. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.
bash
unterstützt einen --posix
Switch, der POSIX-konformer ist. Es wird auch versucht, POSIX nachzuahmen, wenn es als aufgerufen wird sh
.
sh = bash?
Wurde lange Zeit /bin/sh
verwendet, um /bin/bash
auf die meisten GNU / Linux-Systeme zu verweisen . Infolgedessen war es fast sicher, 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 verwiesen wird /bin/bash
(und auf die 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 des Startvorgangs des Linux-Systems ausgeführt wird
initramfs
. Es wird die ash
Shell-Implementierung verwendet.
- BSDs und im Allgemeinen alle Nicht-Linux-Systeme. OpenBSD verwendet
pdksh
einen Nachkommen der Korn-Shell. FreeBSD sh
ist ein Abkömmling der ursprünglichen UNIX-Bourne-Shell. Solaris hat eine eigene, sh
die lange Zeit nicht POSIX-kompatibel war. Eine kostenlose Implementierung ist im Heirloom-Projekt verfügbar .
Wie können Sie herausfinden, worauf /bin/sh
Ihr System abzielt?
Die Komplikation ist, dass es /bin/sh
sich um eine symbolische oder eine harte Verbindung handeln kann. Wenn es ein symbolischer Link, ein tragbarer Weg , es zu lösen ist:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Wenn es sich um eine harte Verbindung handelt, 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, aber der Nachteil dieser Methode ist, 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» schreiben.
Z.B
#!/bin/sh
wird verwenden sh
(und auf was auch immer das hinweist),
#!/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 POSIX-Systeme - auch wenn es nicht vorhanden ist
bash
, muss es vorhanden seinsh
Auch die Verwendung bietet Vorteile bash
. Seine Funktionen machen das Programmieren bequemer und ähneln dem Programmieren in anderen modernen Programmiersprachen. Dazu gehören lokale Variablen und Arrays mit Gültigkeitsbereich. Plain sh
ist eine sehr minimalistische Programmiersprache.