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?

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 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.

Was ist bash?

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.

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:

  1. Moderne Debian- und Ubuntu-Systeme, die standardmäßig einen Symlink von sh auf dash haben;
  2. Busybox, das normalerweise während des Bootvorgangs des Linux-Systems als Teil von initramfs ausgeführt wird. Es benutzt die ash-Shell-Implementierung.
  3. BSDs, und im Allgemeinen alle Nicht-Linux-Systeme. OpenBSD benutzt 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.

Shebang-Zeile

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

Welche zu verwenden ist

Für meine eigenen Skripte bevorzuge ich aus den folgenden Gründen sh:

  • es ist standardisiert
  • es ist viel einfacher und leichter zu erlernen
  • sie ist portabel über POSIX-Systeme hinweg - selbst wenn diese keine bash haben, müssen sie sh haben

Es 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.

Kommentare (18)

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.

Kommentare (4)

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:

  • Eine Shell ist wie eine Schnittstelle, eine Spezifikation oder eine API.
  • sh ist eine Klasse, die die Shell-Schnittstelle implementiert.
  • Bash ist eine Unterklasse von sh.

Kommentare (2)