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?
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 von sh
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.
Die bash
begann als eine sh
-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 dass bash
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 als sh
aufgerufen wird.
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
auf dash
haben;initramfs
ausgeführt wird. Es benutzt die ash
-Shell-Implementierung.pdksh
, ein Nachkomme der Korn-Shell. FreeBSD's sh
ist ein Nachkomme der ursprünglichen UNIX Bourne Shell. Solaris hat seine eigene sh
, 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:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Wenn es ein harter Link ist, versuchen Sie
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
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 verlangt find
nicht, die Option -samefile
zu unterstützen,
obwohl sowohl GNU find als auch FreeBSD find sie unterstützen.
Letztendlich liegt es an Ihnen, zu entscheiden, welche Sie verwenden wollen, indem Sie die "shebang"-Zeile schreiben.
z.B.
#!/bin/sh
wird sh
(und was auch immer darauf verweist) verwendet,
#!/bin/bash
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.
#!/bin/dash
Für meine eigenen Skripte bevorzuge ich aus den folgenden Gründen sh
:
bash
haben, müssen sie sh
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. Einfaches sh
ist eine sehr minimalistische Programmiersprache.
sh": http://man.cx/sh Bash": http://man.cx/bash
TL;DR: bash
ist eine Obermenge von sh
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
gleich bash
. Prüfen Sie sh --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: