it-swarm.com.de

Unterschied zwischen sh und bash

Beim Schreiben von Shell-Programmen verwenden wir häufig /bin/sh und /bin/bash. Normalerweise benutze ich bash, aber ich weiß nicht, was der Unterschied zwischen ihnen ist.

Was ist der Hauptunterschied zwischen bash und sh?

Was müssen wir bei der Programmierung in bash und sh beachten?

1139
Weiwei Yang

Was ist sh

sh (oder die Shell-Befehlssprache) ist eine Programmiersprache, die vom POSIX-Standard beschrieben wird. Es hat viele Implementierungen (ksh88, dash, ...). bash kann auch als Implementierung von sh betrachtet werden (siehe unten).

Da sh eine Spezifikation und keine Implementierung ist, ist /bin/sh ein Symlink (oder ein fester Link) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.

Was ist Bash?

bash startete als sh -kompatible Implementierung (obwohl sie einige Jahre älter ist als der POSIX-Standard), hat aber im Laufe der Zeit viele Erweiterungen erhalten. Viele dieser Erweiterungen können das Verhalten gültiger POSIX-Shell-Skripte ändern, sodass bash für sich genommen keine gültige POSIX-Shell ist. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.

bash unterstützt einen --posix -Schalter, der die POSIX-Kompatibilität erhöht. Es wird auch versucht, POSIX nachzuahmen, wenn es als sh aufgerufen wird.

sh = bash?

Lange Zeit zeigte /bin/sh auf den meisten GNU/Linux-Systemen auf /bin/bash. 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, bei denen /bin/sh nicht auf /bin/bash verweist (und bei denen /bin/bash möglicherweise gar nicht vorhanden ist):

  1. Moderne Debian- und Ubuntu-Systeme, die standardmäßig sh mit dash verknüpfen;
  2. Busybox , das normalerweise während der Startzeit des Linux-Systems als Teil von initramfs ausgeführt wird. Es wird die Shell-Implementierung ash verwendet.
  3. BSDs und im Allgemeinen alle Nicht-Linux-Systeme. OpenBSD verwendet pdksh, einen Nachkommen der Korn-Shell. FreeBSDs sh ist ein Nachkomme der ursprünglichen UNIX-Bourne-Shell. Solaris hat ein eigenes sh, das lange Zeit nicht mit POSIX kompatibel war. Eine kostenlose Implementierung finden Sie im Heirloom-Projekt .

Wie können Sie herausfinden, auf was /bin/sh auf Ihrem System verweist?

Die Komplikation ist, dass /bin/sh eine symbolische Verbindung oder eine feste Verbindung sein kann. Wenn es sich um eine symbolische Verknüpfung handelt, ist eine portable Möglichkeit, diese aufzulösen:

% 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 deckt das -L -Flag sowohl Symlinks als auch Hardlinks ab. Der Nachteil dieser Methode besteht jedoch darin, dass sie nicht portierbar ist - POSIX nicht erforderlichfind zur Unterstützung des -samefile -Option, obwohl sowohl GNU find als auch FreeBSD find dies 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 sh verwenden (und auf was auch immer das hinweist),

#!/bin/bash

wird /bin/bash verwenden, wenn es verfügbar ist (und mit einer Fehlermeldung fehlschlagen, wenn es nicht verfügbar 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 sie nicht bash haben, müssen sie sh haben

Die Verwendung von bash bietet ebenfalls Vorteile. 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.

1008
Roman Cheplyaka

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 in fast allen Fällen sicher, eine Bash-Shebang-Linie zu verwenden, da sie auf modernen Plattformen allgegenwärtig ist.

Hinweis: In einigen Umgebungen ist shbash. Überprüfen Sie sh --version.

119
Rein Henrichs

Diese Frage wurde häufig als Kanonik für Personen vorgeschlagen, die versuchen, sh zu verwenden, und sind überrascht, dass sie sich nicht wie bash verhält. Hier ein kurzer Überblick über häufige Missverständnisse und Fallstricke.

Zunächst sollten Sie verstehen, was Sie erwartet.

  • Wenn Sie Ihr Skript mit sh scriptname ausführen oder es mit scriptname ausführen und #!/bin/sh in der Shebang -Zeile haben, sollten Sie das Verhalten von POSIX sh erwarten.
  • Wenn Sie Ihr Skript mit bash scriptname oder mit scriptname ausführen und #!/bin/bash (oder das lokale Äquivalent) in der Shebang-Zeile haben, sollten Sie das Verhalten von Bash erwarten.

Ein korrekter Shebang und das Ausführen des Skripts durch Eingabe nur des Skriptnamens (möglicherweise mit einem relativen oder vollständigen Pfad) ist im Allgemeinen die bevorzugte Lösung. Zusätzlich zu einem korrekten Shebang erfordert dies, dass die Skriptdatei über die Ausführungsberechtigung (chmod a+x scriptname) verfügt.

Wie unterscheiden sie sich eigentlich?

Das Bash-Referenzhandbuch enthält ein Abschnitt, in dem versucht wird, die Unterschiede aufzuzählen , aber einige häufig auftretende Ursachen für Verwirrung schließen ein

  • [[ ist in sh nicht verfügbar (nur [, was klobiger und begrenzter ist).
  • sh hat keine Arrays.
  • Einige Bash-Schlüsselwörter wie local, source, function und select sind nicht für sh übertragbar. (Einige sh-Implementierungen unterstützen beispielsweise local.)
  • Bash hat viele Syntaxerweiterungen im C-Stil wie $'string\nwith\tC\aescapes' und die for((i=0;i<=3;i++)) -Schleife mit drei Argumenten, += Inkrementzuweisung usw.
  • Bash unterstützt <<<'here strings'.
  • Bash hat *.{png,jpg} und {0..12} Klammererweiterung.
  • ~ verweist auf $HOME nur in Bash (und allgemeiner auf ~username im Ausgangsverzeichnis von username).Dies ist in POSIX enthalten, fehlt jedoch möglicherweise in einigen Implementierungen vor POSIX /bin/sh.
  • Bash hat eine Prozessersetzung mit <(cmd) und >(cmd).
  • Bash hat Csh-ähnliche Weiterleitungs-Aliase wie &| für 2>&1 | und &> für > ... 2>&1
  • Bash unterstützt Coprozesse mit <> Umleitung.
  • Bash bietet eine Vielzahl erweiterter nicht standardmäßiger Parametererweiterungen wie ${substring:1:2}, ${variable/pattern/replacement}, Groß-/Kleinschreibung usw.
  • Bash hat die Möglichkeiten für Shell-Arithmetik erheblich erweitert (obwohl noch keine Gleitkomma-Unterstützung vorhanden ist). Es gibt eine veraltete Legacy-Syntax $[expression], die jedoch durch eine POSIX-Arithmetiksyntax $((expression)) ersetzt werden sollte. (Einige ältere Implementierungen vor POSIX sh unterstützen dies jedoch möglicherweise nicht.)
  • Viele, viele Nur-Bash-Erweiterungen, um optionales Verhalten zu aktivieren oder zu deaktivieren und den internen Status der Shell offenzulegen.
  • Viele, viele Komfortfunktionen für die interaktive Verwendung, die sich jedoch nicht auf das Skriptverhalten auswirken.

Denken Sie daran, dies ist eine verkürzte Liste. Lesen Sie das Referenzhandbuch für die vollständige Übersicht und http://mywiki.wooledge.org/Bashism für viele gute Problemumgehungen. und/oder versuchen Sie http://shellcheck.net/ , das für viele Bash-only-Funktionen warnt.

Ein häufiger Fehler besteht darin, eine #!/bin/bash Shebang-Zeile zu haben, dann aber trotzdem sh scriptname zu verwenden, um das Skript tatsächlich auszuführen. Dadurch wird im Grunde jede reine Bash-Funktionalität deaktiviert, sodass Syntaxfehler auftreten, z. für den Versuch, Arrays zu verwenden. (Die Shebang-Zeile ist syntaktisch ein Kommentar und wird in diesem Szenario einfach ignoriert.)

Leider warnt Bash nicht, wenn Sie versuchen, diese Konstrukte zu verwenden, wenn es als sh aufgerufen wird. Es deaktiviert auch nicht alle Nur-Bash-Funktionen. Das Ausführen von Bash durch Aufrufen als sh ist daher keine gute Möglichkeit, um zu überprüfen, ob Ihr Skript vorhanden ist ist ordnungsgemäß portierbar für ash / dash /POSIX sh oder Varianten wie Heirloom sh

61
tripleee

Beitrag von NIX.COM

Shell-Funktionen

In der folgenden Tabelle sind die meisten Funktionen aufgelistet, bei denen Sie meiner Meinung nach eine Shell einer anderen vorziehen. Es ist nicht als endgültige Liste gedacht und enthält nicht jede einzelne mögliche Funktion für jede einzelne mögliche Shell. Eine Funktion wird in einer Shell nur dann berücksichtigt, wenn sie in der mit dem Betriebssystem gelieferten Version enthalten ist oder als direkt aus der Standarddistribution kompiliert verfügbar ist. Insbesondere ist die unten angegebene C-Shell diejenige, die unter SUNOS 4 verfügbar ist. * Eine beträchtliche Anzahl von Anbietern liefert jetzt entweder tcsh oder stattdessen ihre eigene erweiterte C-Shell aus (sie machen nicht immer deutlich, dass sie tcsh liefern.

Code:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

Schlüssel zur obigen Tabelle.

Y Funktion kann mit dieser Shell ausgeführt werden.

N Feature ist in der Shell nicht vorhanden.

F Die Funktion kann nur mithilfe des Muschelfunktionsmechanismus ausgeführt werden.

L Die Readline-Bibliothek muss mit der Shell verknüpft sein, um diese Funktion zu aktivieren.

Anmerkungen zur obigen Tabelle

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the Shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this Shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.
48
SriniV

Shell ist eine Schnittstelle zwischen einem Benutzer und dem Betriebssystem, über die auf die Dienste eines Betriebssystems zugegriffen werden kann. Es kann sich um eine GUI oder CLI (Command Line Interface) handeln.

sh (Bourne sh ell) ist ein Shell-Befehlszeileninterpreter. für Unix/Unix-ähnliche Betriebssysteme. Es bietet einige eingebaute Befehle. In der Skriptsprache bezeichnen wir den Interpreter als #!/bin/sh. Es wurde am häufigsten von anderen Shells wie bash (frei/offen), kash (nicht frei) unterstützt.

Bash (B ourne a gain s hell) 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-kompatible Systeme funktionieren sollen. Bash ist keine POSIX-kompatible Shell. In einer Skriptsprache bezeichnen wir den Interpreter als #!/bin/bash.

Analogie:

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

enter image description here

37
Premraj

TERMINAL

  • programm (e), die ein Fenster öffnen
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm und eterm.

Shell

  • Ist ein Programm, das im Terminal läuft
  • Shell ist sowohl ein Befehlsinterpreter als auch eine Programmiersprache
  • Shell ist einfach ein Makroprozessor, der Befehle ausführt.
  • Makroprozessor bedeutet Funktionalität, bei der Text und Symbole erweitert werden, um größere Ausdrücke zu erstellen.

SH Vs. BASH

SH

  • (Schale)
  • Ist eine bestimmte Shell
  • ein Befehlsinterpreter und eine Programmiersprache
  • Vorgänger von BASH

BASH

  • (Bourne-Again-Shell)
  • Ist eine bestimmte Shell
  • ein Befehlsinterpreter und eine Programmiersprache
  • Hat sh Funktionalität und mehr
  • Nachfolger von SH
  • BASH ist die Standard-Shell

REFERENZMATERIAL:

Shell gnu.org:

An seiner Basis ist eine Shell einfach ein Makroprozessor , der Befehle ausführt. Der Begriff Makroprozessor bedeutet Funktionalität, bei der Text und Symbole erweitert werden, um größere Ausdrücke zu erstellen.

Eine Unix-Shell ist sowohl ein Befehlsinterpreter als auch eine Programmiersprache. Als Befehlsinterpreter bietet die Shell die Benutzeroberfläche für die umfangreichen Dienstprogramme GNU. Mit den Funktionen der Programmiersprache können diese Dienstprogramme kombiniert werden. Dateien, die Befehle enthalten, können erstellt werden und werden selbst zu Befehlen. Diese neuen Befehle haben denselben Status wie Systembefehle in Verzeichnissen wie/bin, sodass Benutzer oder Gruppen benutzerdefinierte Umgebungen einrichten können, um ihre allgemeinen Aufgaben zu automatisieren.

Shells können interaktiv oder nicht interaktiv verwendet werden. Im interaktiven Modus akzeptieren sie Eingaben über die Tastatur. Bei nicht interaktiver Ausführung führen Shells Befehle aus, die aus einer Datei gelesen wurden.

Eine Shell ermöglicht die synchrone und asynchrone Ausführung von GNU Befehlen. Die Shell wartet auf den Abschluss synchroner Befehle, bevor sie weitere Eingaben akzeptiert. asynchrone Befehle werden weiterhin parallel zur Shell ausgeführt, während zusätzliche Befehle gelesen und ausgeführt werden. Die Umleitungskonstrukte ermöglichen eine fein abgestimmte Steuerung der Eingabe und Ausgabe dieser Befehle. Darüber hinaus ermöglicht die Shell die Kontrolle über den Inhalt der Befehlsumgebungen.

Shells bieten auch einen kleinen Satz integrierter Befehle (Builtins), die Funktionen implementieren, die über separate Dienstprogramme nicht oder nur schwer zu erhalten sind. Beispielsweise können cd, break, continue und exec nicht außerhalb der Shell implementiert werden , da sie die Shell selbst direkt manipulieren. Die eingebauten Befehle history, getopts, kill oder pwd könnten unter anderem in separaten Dienstprogrammen implementiert werden, sind jedoch bequemer als eingebaute Befehle zu verwenden. Alle Shell-Builtins werden in den folgenden Abschnitten beschrieben.

Die Ausführung von Befehlen ist zwar unabdingbar, aber der größte Teil der Leistungsfähigkeit (und Komplexität) von Shells beruht auf ihren eingebetteten Programmiersprachen. Wie jede Hochsprache bietet die Shell Variablen und Flusskontrolle Konstrukte, Zitate und Funktionen.

Shells bieten Funktionen, die speziell auf die interaktive Verwendung ausgerichtet sind, anstatt die Programmiersprache zu erweitern. Diese interaktiven Funktionen umfassen Auftragssteuerung, Befehlszeilenbearbeitung, Befehlsverlauf und Aliase. Jede dieser Funktionen wird in diesem Handbuch beschrieben.

BASHgnu.org:

Bash ist die Shell oder der Befehlsspracheninterpreter für das Betriebssystem GNU. Der Name ist eine Abkürzung für "Bourne-Again Shell", ein Wortspiel über Stephen Bourne, den Autor des direkten Vorfahren der aktuellen Unix Shell-Version, die in der siebten Ausgabe der Bell Labs Research-Version von Unix erschienen ist.

Bash ist weitgehend kompatibel mit sh und enthält nützliche Funktionen aus der Korn Shell ksh und der C Shell csh. Es soll eine konforme Implementierung des Teils der IEEE POSIX-Shell und -Tools der IEEE POSIX-Spezifikation (IEEE-Standard 1003.1) sein. Es bietet Funktionsverbesserungen gegenüber sh sowohl für die interaktive Verwendung als auch für die Programmierung.

Während das Betriebssystem GNU andere Shells bereitstellt, einschließlich einer Version von csh, ist Bash die Standard-Shell . Wie andere GNU Software ist Bash ziemlich portabel. Derzeit läuft es auf nahezu jeder Unix-Version und einigen anderen Betriebssystemen - unabhängig voneinander unterstützte Ports gibt es für MS-DOS-, OS/2- und Windows-Plattformen.

22

Andere Antworten wiesen allgemein auf den Unterschied zwischen Bash und einem POSIX-Shell-Standard hin. Wenn Sie jedoch portable Shell-Skripte schreiben und an die Bash-Syntax gewöhnt sind, ist eine Liste typischer Bashismen und entsprechender reiner POSIX-Lösungen sehr praktisch. Diese Liste wurde erstellt, als Ubuntu von Bash zu Dash als Standard-System-Shell wechselte. Sie finden sie hier: https://wiki.ubuntu.com/DashAsBinSh

Darüber hinaus gibt es ein großartiges Tool namens checkbashisms , das in Ihrem Skript nach Bashismen sucht und nützlich ist, wenn Sie sicherstellen möchten, dass Ihr Skript portierbar ist.

14

/bin/sh kann das gleiche Programm wie /bin/bash aufrufen oder auch nicht.

sh unterstützt mindestens die Funktionen erforderlich für POSIX (unter der Annahme einer korrekten Implementierung). Es kann auch Erweiterungen unterstützen.

bash, die "Bourne Again Shell", implementiert die Funktionen, die für sh und bash-spezifische Erweiterungen erforderlich sind. Der vollständige Satz an Erweiterungen ist zu lang, um hier beschrieben zu werden, und variiert mit neuen Versionen. Die Unterschiede sind im bash-Handbuch dokumentiert. Geben Sie info bash ein und lesen Sie den Abschnitt "Bash Features" (Abschnitt 6 in der aktuellen Version) oder lesen Sie aktuelle Dokumentation online .

3
Keith Thompson

bash und Sh sind zwei verschiedene Shells. Grundsätzlich ist bash sh mit mehr Funktionen und einer besseren Syntax. Die meisten Befehle funktionieren gleich, sind jedoch unterschiedlich. Bash (bash) ist eine von vielen verfügbaren (und dennoch am häufigsten verwendeten) Unix-Shells. Bash steht für "Bourne Again Shell" und ist ein Ersatz/eine Verbesserung der ursprünglichen Bourne Shell (sh).

Shell-Skripte sind Skripte in jeder Shell, während Bash-Skripte speziell für Bash geschrieben werden. In der Praxis werden "Shell-Skript" und "Bash-Skript" jedoch häufig synonym verwendet, es sei denn, die fragliche Shell ist nicht Bash.

Allerdings sollten Sie wissen, dass/bin/sh auf den meisten Systemen eine symbolische Verknüpfung darstellt und nicht sh aufruft. In Ubuntu/bin/sh zum Verknüpfen mit Bash verwendet, typisches Verhalten bei Linux-Distributionen, wurde jedoch jetzt zum Verknüpfen mit einer anderen Shell namens Dash geändert. Ich würde bash verwenden, da dies so ziemlich der Standard ist (oder zumindest meiner Erfahrung nach am häufigsten vorkommt). Tatsächlich treten Probleme auf, wenn ein Bash-Skript "#!/Bin/sh" verwendet, da der Skripthersteller davon ausgeht, dass der Link "Bash" ist, wenn dies nicht erforderlich ist.

1
Gopika BG