Was ist sh
sh(oder die Shell Command Language) ist eine Programmiersprache, die vom POSIX-Standard beschrieben wird . Es hat viele Implementierungen ( ksh88, dash, ...). bashkann auch als Implementierung von sh(siehe unten) betrachtet werden.
Da shes sich um eine Spezifikation handelt, nicht um eine Implementierung, /bin/shhandelt es sich um einen Symlink (oder einen festen Link) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.
Was ist Bash?
bashshBegonnen 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 bashnicht um eine gültige POSIX-Shell handelt. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.
bashunterstützt einen --posixSwitch, der POSIX-konformer ist. Es wird auch versucht, POSIX nachzuahmen, wenn es als aufgerufen wird sh.
sh = bash?
Wurde lange Zeit /bin/shverwendet, um /bin/bashauf 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/shdie nicht verwiesen wird /bin/bash(und auf die 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 des Startvorgangs des Linux-Systems ausgeführt wird
initramfs. Es wird die ashShell-Implementierung verwendet.
- BSDs und im Allgemeinen alle Nicht-Linux-Systeme. OpenBSD verwendet
pdksheinen Nachkommen der Korn-Shell. FreeBSD shist ein Abkömmling der ursprünglichen UNIX-Bourne-Shell. Solaris hat eine eigene, shdie lange Zeit nicht POSIX-kompatibel war. Eine kostenlose Implementierung ist im Heirloom-Projekt verfügbar .
Wie können Sie herausfinden, worauf /bin/shIhr System abzielt?
Die Komplikation ist, dass es /bin/shsich 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 -Ldeckt das Flag sowohl Symlinks als auch Hardlinks ab, aber der Nachteil dieser Methode ist, 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» schreiben.
Z.B
#!/bin/sh
wird verwenden sh(und auf was auch immer das hinweist),
#!/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 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 shist eine sehr minimalistische Programmiersprache.