Unterschied zwischen sh und bash


1304

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

Was ist der Hauptunterschied zwischen bashund sh?

Was müssen wir beim Programmieren in bashund beachten sh?


21
Eine nützliche Liste von Bashismen und entsprechendem Code, der auf der Bourne-Shell funktioniert, finden Sie unter mywiki.wooledge.org/Bashism
StackExchange saddens dancek 20.

1
Vielleicht möchten Sie den POSIX- Standard für sh und seine Befehlssprache sehen: * sh * Shell-Befehlssprache
Maurício C Antunes

7
In der Regel werden alle sh-Skripte aufgrund ihrer Posix-Kompatibilität unter bash ausgeführt, aber nicht alle bash-Skripte können unter sh ausgeführt werden. Die Hauptunterschiede, die Sie bemerken, sind Dinge wie [[]] anstelle von [] Vergleichen, die nicht zitierte Leerzeichen zulassen. $ (()) anstelle von $ [] arithmetischen Ausdrücken und anderen Dingen wie "es ist zu groß und zu langsam" direkt aus den Bash-Dokumenten. Neue Scripter müssen sich jedoch nicht auf sh-kompatible Skripte beschränken, es sei denn, sie drehen für einige Abwärtskompatibilität, was heutzutage meistens nicht der Fall ist, schließlich ist (oder war ...) das Jahr 2014 richtig?
Osirisgothra

Antworten:


1140

Was ist sh

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

Da shes sich bei einer Spezifikation und nicht um eine Implementierung handelt, /bin/shhandelt es sich um einen Symlink (oder einen Hardlink) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.

Was ist Bash?

bashEs wurde als shkompatible Implementierung gestartet (obwohl es einige Jahre vor dem POSIX-Standard liegt), hat aber im Laufe der Zeit viele Erweiterungen erhalten. Viele dieser Erweiterungen können das Verhalten gültiger POSIX-Shell-Skripte ändern, sodass sie für sich genommen bashkeine gültige POSIX-Shell sind. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.

bashunterstützt einen --posixSwitch, wodurch er POSIX-kompatibler wird. Es wird auch versucht, POSIX nachzuahmen, wenn es als aufgerufen wird sh.

sh = bash?

Lange Zeit /bin/shverwendet, um /bin/bashauf den meisten GNU / Linux-Systemen zu verweisen . Infolgedessen war es fast sicher geworden, 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 hingewiesen wird /bin/bash(und auf denen einige /bin/bashmöglicherweise gar nicht existieren), sind:

  1. Modernes Debian und Ubuntu - Systeme, die ein symbolischer Link shzu dashstandardmäßig;
  2. Busybox , die normalerweise während der Startzeit des Linux-Systems als Teil von ausgeführt wird initramfs. Es verwendet die ashShell-Implementierung.
  3. BSDs und im Allgemeinen alle Nicht-Linux-Systeme. OpenBSD verwendet pdksheinen Nachkommen der Korn-Shell. FreeBSDs shist ein Nachkomme der ursprünglichen UNIX Bourne-Shell. Solaris hat eine eigene, shdie lange Zeit nicht POSIX-konform war. Eine kostenlose Implementierung ist im Heirloom-Projekt verfügbar .

Wie können Sie herausfinden, auf welche /bin/shPunkte auf Ihrem System verwiesen wird?

Die Komplikation ist, dass es /bin/shsich um eine symbolische oder eine harte Verbindung handeln kann. Wenn es sich um eine symbolische Verbindung handelt, können Sie sie auf tragbare Weise beheben:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Wenn es eine harte Verbindung ist, versuchen Sie es

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

Tatsächlich -Ldeckt das Flag sowohl Symlinks als auch Hardlinks ab. Der Nachteil dieser Methode ist jedoch, 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» als allererste Zeile des Skripts schreiben.

Z.B

#!/bin/sh

wird verwenden sh(und was auch immer das passiert, um darauf hinzuweisen),

#!/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 alle POSIX-Systeme - auch wenn sie es nicht haben bash, müssen sie es habensh

Die Verwendung bietet ebenfalls Vorteile bash. Seine Funktionen machen das Programmieren bequemer und ähneln dem Programmieren in anderen modernen Programmiersprachen. Dazu gehören beispielsweise lokale Variablen und Arrays mit Gültigkeitsbereich. Plain shist eine sehr minimalistische Programmiersprache.


Wenn Sie ein Skript mit bashder Anzeige ausführen , sind nützlichere Fehlermeldungen im Falle eines Syntaxfehlers. Sie können einfach Zeit sparen, indem Sie bash verwenden.
PHPst

Was bedeutet das %am Anfang Ihrer Befehlszeilen?
JosephHarriott

@JosephHarriott es ist eine Eingabeaufforderung: ein Zeichen, das von der Shell selbst gedruckt wird, woraufhin Ihr Befehl folgt. Einige Shells verwenden $anstelle von %oder #für die Root-Shell.
Roman Cheplyaka

@ RomanCheplyaka welche Muscheln? Ich habe nur gesehen $und #...
JosephHarriott

@ RomanCheplyaka Ich bin mir sicher, dass es shschon lange vor Bash existiert hat (was für Bourne-Again-Shell steht). Aber es war sehr primitiv und reagierte nicht auf terminale Ereignisse wie ESCCharaktere. Dann kshkam (auch vor Bash), dann begann Bash von denen, die die Idee einer besseren Shell liebten, aber ksh hassten. :-)
raminr

145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bashist eine Obermenge shmit einer eleganteren Syntax und mehr Funktionalität. In fast allen Fällen ist es sicher, eine Bash-Shebang-Linie zu verwenden, da diese auf modernen Plattformen allgegenwärtig ist.

NB: In einigen Umgebungen sh ist bash . Überprüfen Sie sh --version.


31
Wenn bash als sh aufgerufen wird, verhält es sich etwas anders. Siehe gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Aufgerufen mit dem Namen sh") und gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Zum Beispiel keine Prozessersetzung.
Glenn Jackman

11
Da bash eine Obermenge von sh ist und einige Betriebssysteme wie FreeBSD nicht standardmäßig bash installiert haben, bietet die Skripterstellung in sh eine größere Portabilität.
user674062

1
Da es keine portable skriptfähige Möglichkeit gibt, eine POSIX-Shell für ein bestimmtes Skript abzurufen, können portable Skripte nicht mehr als Bourne Shell-Funktionen annehmen.
schily

83

Diese Frage wurde häufig als Kanonik für Personen nominiert, die versuchen, sie zu verwenden, shund sind überrascht, dass sie sich nicht so verhält wie bash. Hier finden Sie eine kurze Übersicht über häufige Missverständnisse und Fallstricke.

Zunächst sollten Sie verstehen, was Sie erwartet.

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

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 muss die Skriptdatei über die Ausführungsberechtigung ( chmod a+x scriptname) verfügen .

Wie unterscheiden sie sich eigentlich?

Das Bash-Referenzhandbuch enthält einen Abschnitt, in dem versucht wird, die Unterschiede aufzuzählen. Einige häufig auftretende Verwirrungsquellen sind jedoch

  • [[ist nicht verfügbar in sh(nur [was klobiger und begrenzter ist).
  • sh hat keine Arrays.
  • Einige Bash Schlüsselwörter wie local, source, function, shopt, let, declare, und selectsind nicht tragbar sh. (Einige shImplementierungen unterstützen z local.
  • Bash verfügt über viele Syntaxerweiterungen im C-Stil wie die for((i=0;i<=3;i++))Schleife mit drei Argumenten , die +=Zuweisung von Inkrementen usw. Die $'string\nwith\tC\aescapes'Funktion wird vorläufig für POSIX akzeptiert (dh sie funktioniert jetzt in Bash, wird jedoch von shSystemen, die nur den aktuellen Anforderungen entsprechen, noch nicht unterstützt POSIX-Spezifikation und wird wahrscheinlich noch einige Zeit nicht kommen).
  • Bash unterstützt <<<'here strings'.
  • Bash hat *.{png,jpg}und {0..12}klammert Expansion.
  • ~bezieht sich $HOMEnur auf Bash (und allgemeiner ~usernameauf das Home-Verzeichnis von username).Dies ist in POSIX enthalten, fehlt jedoch möglicherweise in einigen /bin/shImplementierungen vor POSIX .
  • Bash hat eine Prozessersetzung durch <(cmd)und >(cmd).
  • Bash hat Csh-ähnliche Convenience-Redirection-Aliase wie &|für 2>&1 |und &>für> ... 2>&1
  • Bash unterstützt Coprozesse mit <>Umleitung.
  • Heftiger Schlag verfügt über einen umfangreichen Satz von erweiterten Nicht-Standard - Parameter Erweiterungen wie ${substring:1:2}, ${variable/pattern/replacement}, Fall Umwandlung usw.
  • Bash hat die Möglichkeiten für die Shell-Arithmetik erheblich erweitert (obwohl immer noch keine Gleitkomma-Unterstützung vorhanden ist). Es gibt eine veraltete Legacy- $[expression]Syntax, die jedoch durch die arithmetische POSIX- $((expression))Syntax ersetzt werden sollte. (Einige ältere Pre-POSIX- shImplementierungen unterstützen dies jedoch möglicherweise nicht.)
  • Magische Variablen wie $RANDOM, $SECONDS, $PIPESTATUS[@]und $FUNCNAMEsind Bash - Erweiterungen.
  • Syntaktische Unterschiede wie export variable=valueund [ "x" == "y" ]die nicht portierbar sind ( export variablesollten von der Variablenzuweisung getrennt sein, und der Vergleich von tragbaren Zeichenfolgen [ ... ]verwendet ein einzelnes Gleichheitszeichen).
  • Viele, viele Nur-Bash-Erweiterungen, um optionales Verhalten zu aktivieren oder zu deaktivieren und den internen Status der Shell verfügbar zu machen.
  • Viele, viele praktische Funktionen für die interaktive Verwendung, die jedoch das Skriptverhalten nicht beeinflussen.

Denken Sie daran, dies ist eine gekürzte Auflistung. Die vollständige Übersicht finden Sie im Referenzhandbuch und unter http://mywiki.wooledge.org/Bashism. Dort finden Sie viele gute Problemumgehungen. und / oder versuchen Sie es mit http://shellcheck.net/, das vor vielen Nur-Bash-Funktionen warnt.

Ein häufiger Fehler besteht darin, eine #!/bin/bashShebang-Zeile zu haben , diese aber dennoch zu verwenden sh scriptname, um das Skript tatsächlich auszuführen. Dies deaktiviert grundsätzlich alle Nur-Bash-Funktionen, sodass Sie Syntaxfehler erhalten, z. B. wenn Sie versuchen, Arrays zu verwenden. (Die Shebang-Zeile ist syntaktisch ein Kommentar, daher wird sie in diesem Szenario einfach ignoriert.)

Leider warnt Bash nicht, wenn Sie versuchen, diese Konstrukte zu verwenden, wenn es als aufgerufen wird sh. Es deaktiviert auch nicht alle Nur-Bash-Funktionen vollständig. shWenn Sie also Bash ausführen, indem Sie es aufrufen, ist dies keine gute Möglichkeit, um zu überprüfen, ob Ihr Skript ordnungsgemäß auf ash/ dash/ POSIX shoder Varianten wie Heirloom portierbar istsh


2
Grundsätzlich ist die TL; DR-Version die Antwort von And .
Tripleee

4
shellcheck.net war alles was ich brauchte. Danke vielmals.
Josh Habdas

FWIW export variable=valuewird von POSIX beauftragt: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Vielleicht ist es in einigen alten Muscheln nicht erhältlich, aber es ist definitiv kein Bashismus.
Roman Cheplyaka

53

Shell ist eine Schnittstelle zwischen einem Benutzer und dem Betriebssystem, um auf die Dienste eines Betriebssystems zuzugreifen. Dies kann entweder eine GUI oder eine CLI (Command Line Interface) sein.

sh (Bourne sh ell) ist ein Shell-Befehlszeileninterpreter für Unix / Unix-ähnliche Betriebssysteme. Es bietet einige integrierte Befehle. In der Skriptsprache bezeichnen wir Interpreter als #!/bin/sh. Es wurde am häufigsten von anderen Muscheln 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 eigentlich keine POSIX-kompatible Shell. In einer Skriptsprache bezeichnen wir den Interpreter als #!/bin/bash.

Analogie:

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

Geben Sie hier die Bildbeschreibung ein


3
Ich verstehe es nicht Sie haben sowohl "Bash ist eine Obermenge von sh" als auch "Bash ist eine Unterklasse von sh" erwähnt, sind das nicht gegenteilige Aussagen? Können Sie bitte klarstellen?
Keerthana Prabhakaran

11
Ich denke, dies versucht zu sagen, dass Bash von erbt sh(es ist also eine "Unterklasse" im OOP-Sinne) und erweitert es (hat also eine Obermenge der Funktionalität).
Tripleee

52

Post von UNIX.COM

Shell-Funktionen

In der folgenden Tabelle sind die meisten Funktionen aufgeführt, bei denen Sie meiner Meinung nach eine Shell einer anderen vorziehen würden. Es ist nicht als endgültige Liste gedacht und enthält nicht jedes einzelne mögliche Merkmal für jede einzelne mögliche Shell. Eine Funktion befindet sich nur dann in einer Shell, wenn sie in der mit dem Betriebssystem gelieferten Version enthalten ist oder direkt aus der Standarddistribution kompiliert verfügbar ist. Insbesondere die unten angegebene C-Shell ist die unter SUNOS 4. * verfügbare. 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 versenden.

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 Die Funktion kann mit dieser Shell ausgeführt werden.

N Feature ist in der Shell nicht vorhanden.

F Die Funktion kann nur mithilfe des Shells-Funktionsmechanismus 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.

Ihre Tabelle ist für mich nicht nützlich, da sie versucht, Funktionen der Bourne-Shell und Funktionen von ksh aus der Zeit vor 1988 zu vergleichen. Wenn Sie wirklich eine Tabelle für 1988 erstellen, müssten Sie die meisten anderen Shells aus dieser Tabelle entfernen - einschließlich Bash , sh und rc. Können Sie erklären, woher Sie die Werte für Ihre Tabelle haben?
schily

1
Lassen Sie mich einige Hinweise geben: Job Control wurde 1989 zur Bourne Shell hinzugefügt und die Bourne Shell wurde 2005 zu OpenSource. Die Korn Shell hat seit mindestens 1988 eine Prozessersetzung und ist seit 1997 OpenSource. Übrigens: Ihre Aussagen zu $ ​​ENV sind nicht korrekt, $ ENV wird nur für interaktive Shells gelesen / ausgeführt.
schily


@schily Wenn Sie der Meinung sind, dass es irgendwo falsch ist, können Sie es gerne entsprechend bearbeiten.
SriniV

8
Basierend auf dem, was schily enthüllt hat, scheint es besser zu sein, diese Antwort zu entfernen, da sie im Wesentlichen betrügerisch ist und OP die von ihm eingefügten Informationen nicht wirklich überprüft hat.
Danno

24

TERMINAL

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

SCHALE

  • Ist ein Programm, das im Terminal ausgeführt wird
  • 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

Sch

  • (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:

Eine Shell ist an ihrer Basis 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 zahlreichen GNU-Dienstprogramme. Mit den Programmiersprachenfunktionen können diese Dienstprogramme kombiniert werden. Dateien mit Befehlen können erstellt und selbst zu Befehlen werden. 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.

Schalen können interaktiv oder nicht interaktiv verwendet werden. Im interaktiven Modus akzeptieren sie Eingaben, die über die Tastatur eingegeben wurden. Wenn Shells nicht interaktiv ausgeführt werden, führen sie Befehle aus, die aus einer Datei gelesen werden.

Eine Shell ermöglicht die synchrone und asynchrone Ausführung von GNU-Befehlen. Die Shell wartet, bis synchrone Befehle abgeschlossen sind, 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 (integrierte Funktionen), die Funktionen implementieren, die über separate Dienstprogramme nicht oder nur ungünstig verfügbar 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 Verlaufs-, getopts-, kill- oder pwd-Befehle können unter anderem in separaten Dienstprogrammen implementiert werden, sind jedoch bequemer als eingebaute Befehle zu verwenden. Alle eingebauten Shell-Funktionen werden in den folgenden Abschnitten beschrieben.

Während das Ausführen von Befehlen unerlässlich ist, beruht der größte Teil der Leistung (und Komplexität) von Shells auf ihren eingebetteten Programmiersprachen. Wie jede Hochsprache bietet die Shell Variablen, Flusssteuerungskonstrukte, Anführungszeichen und Funktionen.

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

BASH gnu.org:

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

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 IEEE POSIX Shell and Tools-Teils der IEEE POSIX-Spezifikation (IEEE Standard 1003.1) sein. Es bietet funktionale Verbesserungen gegenüber sh sowohl für interaktive als auch für Programmierzwecke.

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


14

Andere Antworten wiesen allgemein auf den Unterschied zwischen Bash und einem POSIX-Shell-Standard hin. Wenn Sie jedoch tragbare 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 als Standardsystem-Shell von Bash zu Dash 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 portabel ist.


Dies ist im Grunde das, worauf meine Antwort von jetzt an wirklich hinausläuft. +1
Tripleee

7

Sie sind fast identisch, haben aber bashmehr Funktionen - shsind (mehr oder weniger) eine ältere Untergruppe vonbash .

shbedeutet oft das Original Bourne shell, das älter ist als bash(Bourne *again* shell ) ist und 1977 erstellt wurde. In der Praxis ist es jedoch möglicherweise besser, es als eine hoch kreuzkompatible Shell zu betrachten, die dem POSIX-Standard von 1992 entspricht.

Skripte, die mit #!/bin/shder shShell beginnen oder diese verwenden, tun dies normalerweise aus Gründen der Abwärtskompatibilität. Jedes Unix / Linux-Betriebssystem hat eine shShell. Unter Ubuntu wird shhäufig aufgerufen dashund unter MacOS ist es eine spezielle POSIX-Version vonbash . Diese Schalen können für standardkonformes Verhalten, Geschwindigkeit oder Abwärtskompatibilität bevorzugt werden.

bashist neuer als das Original sh, fügt mehr Funktionen hinzu und versucht, abwärtskompatibel zu sein sh. Theoretisch sollten shProgramme ausgeführt werden bash. bashist auf fast allen Linux / Unix-Computern verfügbar und wird normalerweise standardmäßig verwendet - mit der bemerkenswerten Ausnahme, dass MacOS zshab Catalina (10.15) standardmäßig verwendet wird . FreeBSD wird standardmäßig nicht mit bashinstalliert.


shweit vor POSIX. Heutzutage würden Sie hoffen, dass alles, was shSie finden, mindestens POSIX-kompatibel ist. Auf Legacy-Systemen ist dies jedoch keineswegs selbstverständlich. POSIX standardisiert weit mehr als die Shell; In der Tat könnte man argumentieren, dass die Standardisierung von Betriebssystemaufrufen und Bibliotheksfunktionen wichtiger ist.
Tripleee

Ich habe das Zeug über POSIX entfernt, um es weniger verwirrend zu machen
Ryan Taylor

3

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

shunterstützt mindestens die von POSIX benötigten Funktionen (unter der Annahme einer korrekten Implementierung). Möglicherweise werden auch Erweiterungen unterstützt.

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


shSie erhalten nur dann eine POSIX-Shell, wenn Sie das richtige PATHSetup in Ihrer aktuellen Shell haben. Es gibt keinen definierten PATH-Namen, der Ihnen eine POSIX-Shell gibt.
schily

Lange Zeit gab shes nicht unbedingt sogar eine POSIX-Shell, zum Beispiel unter Solaris.
Tripleee

3

Bash und Sh sind zwei verschiedene Shells. Grundsätzlich ist bash sh, mit mehr Funktionen und besserer 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 erstellt werden. In der Praxis werden "Shell-Skript" und "Bash-Skript" jedoch häufig synonym verwendet, es sei denn, die betreffende Shell ist nicht Bash.

Allerdings sollten Sie erkennen, dass / bin / sh auf den meisten Systemen eine symbolische Verbindung darstellt und sh nicht aufruft. In Ubuntu / bin / sh, das zum Verknüpfen mit Bash verwendet wurde, ist dies ein typisches Verhalten bei Linux-Distributionen, jetzt wurde jedoch das 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). Tatsächlich treten Probleme auf, wenn ein Bash-Skript #! / Bin / sh verwendet, da der Skript-Hersteller davon ausgeht, dass der Link zu Bash ist, wenn dies nicht erforderlich ist.


0

Die Unterschiede sind so einfach wie möglich: Nach einem grundlegenden Verständnis sind die anderen oben veröffentlichten Kommentare leichter zu erfassen.

Shell - "Shell" ist ein Programm, das die Interaktion zwischen dem Benutzer und dem Betriebssystem (Kernel) erleichtert. Es gibt viele Shell-Implementierungen wie sh, bash, csh, zsh ... etc.

Mit jedem der Shell-Programme können wir Befehle ausführen, die von diesem Shell-Programm unterstützt werden.

Bash - Es leitet sich von B ab ourne- a ab Gewinn Sh ell. Mit diesem Programm können wir alle von Shell angegebenen Befehle ausführen. Außerdem können wir einige Befehle ausführen, die speziell zu diesem Programm hinzugefügt wurden. Bash ist abwärtskompatibel mit sh.

Sh - Es stammt von Bourne Sh . "sh" unterstützt alle in der Shell angegebenen Befehle. Mit diesem Programm können wir alle von Shell angegebenen Befehle ausführen.

Weitere Informationen erhalten Sie unter: - https://man.cx/sh - https://man.cx/bash


Um POSIX zu verstehen, lesen Sie die Antwort von Alex. Bitte überprüfen Sie: stackoverflow.com/a/1780614/1261003
Raihanhbh

Ich versuche nicht, POSIX zu verstehen. Ich überprüfe Ihre Antwort und als solche muss ich sehen, dass Ihre Antwort einen Mehrwert bietet. Ich glaube nicht.
Scratte

Ich glaube, diese kleinen Klarstellungen würden einem Anfänger helfen, den in den obigen Diskussionen verwendeten Jargon bequemer zu verstehen. @Scratte
Raihanhbh

-1

Das Linux-Betriebssystem bietet verschiedene Arten von Shell. Obwohl Shells viele Befehle gemeinsam haben, hat jeder Typ einzigartige Funktionen. Lassen Sie uns verschiedene Arten von meist verwendeten Muscheln untersuchen.

Sh Shell:

Sh Shell ist auch als Bourne Shell bekannt. Die Sh-Shell ist die erste Shell, die 1977 von Stephen Bourne in den Bell Labs von AT & T für Unix-Computer entwickelt wurde. Sie enthält viele Skript-Tools.

Bash Shell:

Bash Shell steht für Bourne Again Shell. Die Bash-Shell ist die Standard-Shell in den meisten Linux-Distributionen und ersetzt die Sh-Shell (die Sh-Shell wird auch in der Bash-Shell ausgeführt). Bash Shell kann die überwiegende Mehrheit der Sh-Shell-Skripte ohne Änderungen ausführen und bietet auch eine Funktion zur Bearbeitung von Befehlszeilen.


Es gab eine frühere Muschel von Ken Thompson. Die Bourne-Shell wurde offiziell in v7 Unix (1979) eingeführt.
Tripleee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.