Unterschied zwischen sh und bash
Wenn wir Shell-Programme schreiben, verwenden wir oft /bin/sh
und /bin/bash
. Ich benutze normalerweise bash
, aber ich weiß nicht, was der Unterschied zwischen ihnen ist.
Was ist der Hauptunterschied zwischen bash
und sh
?
Worauf müssen wir achten, wenn wir in bash
und sh
programmieren?
1182
3
Was ist sh
sh
(oder die Shell Command Language) ist eine Programmiersprache, die durch den POSIX Standard beschrieben wird. Sie hat viele Implementierungen (ksh88
,dash
, ...).bash
kann auch als als eine Implementierung vonsh
betrachtet werden (siehe unten).Weil
sh
eine Spezifikation und keine Implementierung ist, ist/bin/sh
ein Symlink (oder ein Hardlink) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.Was ist bash?
Die
bash
begann als einesh
-kompatible Implementierung (obwohl sie dem POSIX-Standard um einige Jahre voraus ist), aber im Laufe der Zeit hat sie viele Erweiterungen erhalten. Viele dieser Erweiterungen können das Verhalten gültiger POSIX-Shell-Skripte verändern, so dassbash
für sich genommen keine gültige POSIX-Shell ist. Vielmehr ist sie ein Dialekt der POSIX-Shellsprache.Die
bash
unterstützt einen--posix
-Schalter, der sie POSIX-kompatibler macht. Sie versucht auch, POSIX zu imitieren, wenn sie alssh
aufgerufen wird.sh = bash?
Lange Zeit hat
/bin/sh
auf den meisten GNU/Linux-Systemen auf/bin/bash
gezeigt. Infolgedessen war es fast sicher geworden, den Unterschied zwischen den beiden zu ignorieren. Aber das begann sich kürzlich zu ändern.Einige populäre Beispiele für Systeme, auf denen
/bin/sh
nicht auf/bin/bash
zeigt (und auf denen/bin/bash
vielleicht nicht einmal existiert), sind:sh
aufdash
haben;initramfs
ausgeführt wird. Es benutzt dieash
-Shell-Implementierung.pdksh
, ein Nachkomme der Korn-Shell. FreeBSD'ssh
ist ein Nachkomme der ursprünglichen UNIX Bourne Shell. Solaris hat seine eigenesh
, die lange Zeit nicht POSIX-konform war; eine freie Implementierung ist vom Heirloom-Projekt erhältlich.Wie können Sie herausfinden, worauf
/bin/sh
auf Ihrem System zeigt?Die Komplikation besteht darin, dass
/bin/sh
ein symbolischer Link oder ein harter Link sein kann. Wenn es ein symbolischer Link ist, ist ein portabler Weg, ihn aufzulösen:Wenn es ein harter Link ist, versuchen Sie
In der Tat deckt das
-L
Flag sowohl Symlinks als auch Hardlinks ab, aber der Nachteil dieser Methode ist, dass sie nicht portabel ist - POSIX verlangtfind
nicht, die Option-samefile
zu unterstützen, obwohl sowohl GNU find als auch FreeBSD find sie unterstützen.Shebang-Zeile
Letztendlich liegt es an Ihnen, zu entscheiden, welche Sie verwenden wollen, indem Sie die "shebang"-Zeile schreiben.
z.B.
wird
sh
(und was auch immer darauf verweist) verwendet,benutzt
/bin/bash
, wenn es verfügbar ist (und schlägt mit einer Fehlermeldung fehl, wenn es nicht verfügbar ist). Natürlich können Sie auch eine andere Implementierung angeben, z.B.Welche zu verwenden ist
Für meine eigenen Skripte bevorzuge ich aus den folgenden Gründen
sh
:bash
haben, müssen siesh
habenEs gibt auch Vorteile, die
bash
zu benutzen. Ihre Funktionen machen die Programmierung bequemer und ähneln der Programmierung in anderen modernen Programmiersprachen. Dazu gehören Dinge wie skalierte lokale Variablen und Arrays. Einfachessh
ist eine sehr minimalistische Programmiersprache.sh": http://man.cx/sh Bash": http://man.cx/bash
TL;DR:
bash
ist eine Obermenge vonsh
mit einer eleganteren Syntax und mehr Funktionalität. Es ist sicher, eine Bash-Shabang-Zeile in fast allen Fällen zu verwenden, da sie auf modernen Plattformen allgegenwärtig ist.NB: In einigen Umgebungen ist
sh
gleichbash
. Prüfen Siesh --version
.Die Shell ist eine Schnittstelle zwischen einem Benutzer und dem Betriebssystem, um auf die Dienste des Betriebssystems zuzugreifen. Sie kann entweder eine grafische Benutzeroberfläche oder eine Befehlszeilenschnittstelle (CLI) sein.
sh (Bourne shell) ist ein Shell-Befehlszeileninterpreter für Unix/Unix-ähnliche Betriebssysteme. Er bietet einige eingebaute Befehle. In der Skriptsprache bezeichnen wir den Interpreter als
#!/bin/sh
. Sie wurde am meisten von anderen Shells wie bash (frei/offen), kash (nicht frei) unterstützt.Bash (Bourne again shell) ist ein Shell-Ersatz für die Bourne-Shell. Bash ist eine Obermenge von sh. Bash unterstützt sh. POSIX ist eine Reihe von Standards, die definieren, wie POSIX-konforme Systeme funktionieren sollten. Bash ist eigentlich keine POSIX-konforme Shell. In einer Skriptsprache bezeichnen wir den Interpreter als
#!/bin/bash
.Analogie: