Frage Unterschied zwischen sh und bash


Beim Schreiben von Shell-Programmen benutzen 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 beim Programmieren achten? bash und sh?


901
2018-04-20 03:33


Ursprung


Antworten:


Was ist das?

sh (oder die Shell Command Language) ist eine Programmiersprache, die von der POSIX Standard. Es hat viele Implementierungen (ksh88, dash, ...). bash kann auch sein eine Implementierung von betrachtet sh (siehe unten).

weil sh ist eine Spezifikation, keine Implementierung, /bin/sh ist ein Symlink (oder eine feste Verbindung) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.

Was ist Bash?

bash begann als sh-kompatible Implementierung (obwohl es den POSIX-Standard um einige Jahre übertrifft), aber im Laufe der Zeit hat es viele Erweiterungen erworben. Viele dieser Erweiterungen können das Verhalten gültiger POSIX-Shell-Skripte ändern bash ist keine gültige POSIX-Shell. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.

bash unterstützt a --posix Switch, wodurch es POSIX-konformer wird. Es versucht auch POSIX zu imitieren, wenn es als aufgerufen wird sh.

sh = bash?

Für eine lange Zeit, /bin/sh verwendet, um auf zu zeigen /bin/bash auf den meisten GNU / Linux-Systemen. Infolgedessen war es beinahe sicher geworden, 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 zeigt nicht auf /bin/bash (und auf einigen davon /bin/bash kann nicht einmal existieren) sind:

  1. Moderne Debian- und Ubuntu-Systeme, die symlink sh zu dash standardmäßig;
  2. Busybox, die normalerweise während der Boot-Zeit des Linux-Systems als Teil von ausgeführt wird initramfs. Es nutzt die ash Shell-Implementierung.
  3. BSDs und generell alle Nicht-Linux-Systeme. OpenBSD verwendet pdksh, ein Nachkomme der Korn-Schale. FreeBSDs sh ist ein Nachkomme der ursprünglichen UNIX-Bourne-Shell. Solaris hat seine eigene sh was für lange Zeit nicht POSIX-konform war; Eine kostenlose Implementierung ist von der Heirloom-Projekt.

Wie kannst du herausfinden, was? /bin/sh verweist auf Ihr System?

Die Komplikation ist das /bin/sh könnte ein symbolischer Link oder ein fester Link sein. Wenn es sich um einen symbolischen Link handelt, a tragbar Weg, es zu lösen ist:

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

Wenn es eine harte Verbindung ist, versuche es

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

In der Tat, die -L flag umfasst sowohl symbolische als auch symbolische Links, aber der Nachteil dieser Methode ist, dass es nicht tragbar ist - POSIX benötigt nicht  find unterstützen -samefile Möglichkeit, obwohl beide GNU finden und FreeBSD finden unterstütze es.

Shebang Linie

Letztendlich liegt es an Ihnen zu entscheiden, welchen Sie verwenden möchten, indem Sie die «Shebang» -Linie schreiben.

Z.B.

#!/bin/sh

wird benutzen sh (und was auch immer darauf hinweist),

#!/bin/bash

wird benutzen /bin/bash wenn es verfügbar ist (und mit einer Fehlermeldung fehlschlägt, wenn dies nicht der Fall ist). Natürlich können Sie auch eine andere Implementierung angeben, z.

#!/bin/dash

Welcher zu verwenden

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

  • es ist standardisiert
  • es ist viel einfacher und einfacher zu lernen
  • Es ist portabel über POSIX-Systeme - auch wenn sie es nicht haben bashmüssen sie haben sh

Es gibt Vorteile zu verwenden bash auch. Seine Eigenschaften machen die Programmierung komfortabler und ähneln der Programmierung in anderen modernen Programmiersprachen. Dazu gehören Dinge wie lokal begrenzte Variablen und Arrays. Einfach sh ist eine sehr minimalistische Programmiersprache.


855
2018-04-20 04:10



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

NB: In manchen Umgebungen sh  ist  bash. Prüfen sh --version.


85
2018-04-20 03:43



Beitrag von UNIX.COM

Shell-Funktionen

Diese Tabelle listet die meisten Funktionen auf, von denen ich denke, dass Sie eine Shell auf eine andere setzen. Es ist nicht beabsichtigt, eine definitive Liste zu sein und beinhaltet nicht jedes einzelne mögliche Merkmal für jede einzelne mögliche Schale. Ein Feature wird nur dann in einer Shell berücksichtigt, wenn es in der Version des Betriebssystems enthalten ist oder wenn es direkt aus der Standarddistribution kompiliert wird. Insbesondere ist die unten angegebene C-Shell diejenige, die auf SUNOS 4 verfügbar ist. *, Eine beträchtliche Anzahl von Verkäufern liefert nun entweder tcsh oder ihre eigene erweiterte C-Shell (sie machen nicht immer klar, 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 Feature kann mit dieser Shell durchgeführt werden.

N Feature ist in der Shell nicht vorhanden.

F Die Funktion kann nur mit der Shell-Funktion ausgeführt werden           Mechanismus.

L Die readline-Bibliothek muss in die zu aktivierende Shell eingebunden sein           Dieses Feature.

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

42
2017-08-04 06:10



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

Zunächst einmal sollten Sie verstehen, was zu erwarten ist.

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

Es ist im Allgemeinen die bevorzugte Lösung, einen korrekten Shebang zu haben und das Skript auszuführen, indem Sie nur den Skriptnamen eingeben (möglicherweise mit einem relativen oder vollständigen Pfad). Zusätzlich zu einem korrekten Shebang erfordert dies, dass die Skriptdatei über eine Ausführungsberechtigung verfügt (chmod a+x scriptname).

Also, wie unterscheiden sie sich eigentlich?

Das Bash Referenzhandbuch hat a Abschnitt, der versucht, die Unterschiede aufzuzählen aber einige allgemeine Quellen der Verwirrung schließen ein

  • [[ist nicht verfügbar in sh (nur [ das ist klobiger und begrenzt).
  • sh hat keine Arrays.
  • Einige Bash Schlüsselwörter mögen local, function, und select sind nicht tragbar zu sh.
  • Bash hat viele C-Stil Syntax-Erweiterungen wie $'string\nwith\tC\aescapes' und das Drei-Argument for((i=0;i<=3;i++)) Schleife, += Inkrementzuweisung usw.
  • Bash unterstützt <<<'here strings'.
  • Bash hat *.{png,jpg} und {0..9} Klammer Erweiterung.
  • ~ bezieht sich auf $HOME nur in Bash (und allgemeiner ~username zum Home-Verzeichnis von username).
  • Bash hat Prozesssubstitution mit <(cmd) und >(cmd).
  • Bash unterstützt Coprozesse mit <> Umleitung.
  • Bash hat die Möglichkeiten für Shell-Arithmetik (obwohl immer noch keine Fließkomma-Unterstützung) und variable Teilstrang-Manipulation mit erweitert ${substring:1:2}, ${variable/pattern/replacement}, Fallumwandlung usw.
  • Viele, viele Nur-Bash-Erweiterungen, um das optionale Verhalten zu aktivieren oder zu deaktivieren und den internen Zustand der Shell anzuzeigen.
  • Viele, viele Komfortfunktionen für den interaktiven Gebrauch, die sich jedoch nicht auf das Skriptverhalten auswirken.

Denken Sie daran, dies ist eine gekürzte Liste. Siehe das Referenzhandbuch für die vollständige Schaufel und http://mywiki.wooled.org/Bashism für viele gute Umgehungslösungen; und / oder versuchen http://shellcheck.net/ was für viele Bash-only-Features warnt.

Ein häufiger Fehler ist a #!/bin/bash Shebang Linie, aber dann trotzdem verwenden sh scriptname um das Skript tatsächlich auszuführen. Dies deaktiviert im Grunde nur Bash-Funktionalität, so dass Sie Syntaxfehler z. für den Versuch, Arrays zu verwenden.

Leider wird Bash nicht warnen, wenn Sie versuchen, diese Konstrukte zu verwenden, wenn es aufgerufen wird sh. Es wird nicht vollständig deaktiviert alle Bash-only-Funktionalität entweder, so dass Bash ausgeführt wird, indem es als aufgerufen wird sh ist keine gute Möglichkeit zu überprüfen, ob Ihr Skript ordnungsgemäß portierbar ist ash/dash/ POSIX sh.


32
2018-03-08 08:44



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

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

Bash (Bouenne eingewinnen sHölle) 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 sollten. 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 des sh.

21
2018-02-09 09:46



TERMINAL 

  • Programm (e), die ein Fenster aufstellen
  • 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.
  • Macro-Prozessor bedeutet Funktionalität, bei der Text und Symbole zu größeren Ausdrücken erweitert werden.

SH Vs. BASH

Sch

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

BASH

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

SCHALE gnu.org:

An seiner Basis a Shell ist einfach ein Makro-Prozessor das führt aus   Befehle. Der Begriff Makroprozessor bedeutet Funktionalität wo Text und   Symbole werden erweitert, um größere Ausdrücke zu erzeugen.

Ein Unix Shell ist sowohl ein Befehlsinterpreter als auch eine Programmiersprache.   Als Kommandointerpreter stellt die Shell dem Benutzer die Benutzeroberfläche zur Verfügung   reiche Reihe von GNU-Dienstprogrammen. Die Programmiersprachenfunktionen ermöglichen   Diese Dienstprogramme müssen kombiniert werden. Dateien mit Befehlen können sein   erstellt und selbst zu Befehlen. Diese neuen Befehle haben die   gleicher Status wie Systembefehle in Verzeichnissen wie / bin, erlauben   Benutzer oder Gruppen zum Einrichten benutzerdefinierter Umgebungen zur Automatisierung ihrer   gemeinsame Aufgaben.

Schalen können interaktiv oder nicht interaktiv verwendet werden. In interaktiv   Modus akzeptieren sie Eingabe von der Tastatur eingegeben. Bei der Ausführung   Nicht-interaktiv führen Shells Befehle aus, die aus einer Datei gelesen werden.

Eine Shell erlaubt die Ausführung von GNU-Befehlen, sowohl synchron als auch   asynchron. Die Shell wartet auf die Ausführung von synchronen Befehlen   bevor du mehr Input akzeptierst; asynchrone Befehle werden weiterhin ausgeführt   parallel zur Shell, während sie zusätzlich liest und ausführt   Befehle. Die Umleitungskonstrukte erlauben eine feinkörnige Kontrolle von   die Eingabe und Ausgabe dieser Befehle. Darüber hinaus erlaubt die Schale   Kontrolle über den Inhalt der Umgebung von Befehlen.

Shells bieten auch eine kleine Reihe von integrierten Befehlen (Builtins)   Implementieren der Funktionalität unmöglich oder unbequem zu erhalten über   separate Dienstprogramme. Zum Beispiel können cd, break, continue und exec nicht   außerhalb der Shell implementiert werden weil sie direkt manipulieren   die Schale selbst. Die Geschichte, getopts, töten oder pwd Builtins unter   Andere könnten in separaten Dienstprogrammen implementiert werden, aber sie sind mehr   bequem als eingebaute Befehle zu verwenden. Alle Shell Builtins sind   in den folgenden Abschnitten beschrieben.

Während die Ausführung von Befehlen wesentlich ist, der größte Teil der Macht (und   Komplexität) von Shells ist aufgrund ihrer eingebetteten Programmiersprachen.   Wie jede andere Sprache bietet die Shell Variablen, Flow   Kontrollieren Konstrukte, Zitate und Funktionen.

Shells bieten Funktionen, die speziell für den interaktiven Gebrauch gedacht sind   als die Programmiersprache zu erweitern. Diese interaktiven Funktionen   Einschließlich Jobsteuerung, Befehlszeilenbearbeitung, Befehlsverlauf und   Aliase. Jedes dieser Merkmale wird in diesem Handbuch beschrieben.

BASH  gnu.org:

Bash ist die Shell oder der Befehlssprachendolmetscher für die GNU   Betriebssystem. Der Name ist ein Akronym für die 'Bourne-Again SHell',   ein Wortspiel auf Stephen Bourne, der Autor des direkten Vorfahren der   aktuelle Unix-Shell sh, die in der Siebten Edition Bell Labs erschien   Forschungsversion von Unix.

Bash ist weitgehend kompatibel mit SH und enthält nützliche Funktionen   von der Korn-Shell ksh und der C-Shell csh. Es ist beabsichtigt, ein   konforme Implementierung des IEEE POSIX Shell und Tools Teil von   die IEEE-POSIX-Spezifikation (IEEE-Standard 1003.1). Es bietet   funktionale Verbesserungen gegenüber sh für sowohl interaktive als auch Programmierung   benutzen.

Während das GNU-Betriebssystem andere Shells bereitstellt, einschließlich a   Version von Csh, Bash ist die Standard-Shell. Wie andere GNU-Software,   Bash ist ziemlich tragbar. Es läuft derzeit auf fast jeder Version von   Unix und ein paar andere Betriebssysteme - unabhängig unterstützte Ports   existieren für MS-DOS, OS / 2 und Windows-Plattformen.


20
2017-09-03 12:51



Andere Antworten wiesen im Allgemeinen auf den Unterschied zwischen Bash und einem POSIX-Shell-Standard hin. Beim Schreiben von portablen Shell-Skripten und der Verwendung der Bash-Syntax ist jedoch eine Liste typischer Bashismen und entsprechender POSIX-Lösungen sehr hilfreich. Eine solche Liste wurde kompiliert, als Ubuntu als Standard-Systemshell von Bash zu Dash wechselte und hier zu finden ist: https://wiki.ubuntu.com/DashAsBinSh

Außerdem gibt es ein tolles Tool namens Checkbaschismen Das prüft auf Bashismen in Ihrem Skript und ist praktisch, wenn Sie sicherstellen möchten, dass Ihr Skript portabel ist.


14
2018-05-18 02:22



/bin/sh kann oder kann nicht dasselbe Programm wie aufrufen /bin/bash.

sh unterstützt mindestens die Funktionen benötigt von POSIX (unter der Annahme einer korrekten Implementierung). Es kann auch Erweiterungen unterstützen.

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


3
2018-04-09 16:01



Bash (Bash) ist eine von vielen verfügbaren (noch die am häufigsten verwendeten) Unix-Shells. Bash steht für "Bourne Again SHell" und ist ein Ersatz / Verbesserung der ursprünglichen Bourne Shell (sh).

Schale Scripting ist Scripting in jeder Shell, während Bash Scripting speziell für Bash entwickelt wird.


2
2017-07-23 16:37



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

Sh Schale:

Sh Shell ist auch als Bourne Shell bekannt. Sh shell ist die erste Shell, die 1977 von Stephen Bourne im AT & T Bell Labs für Unix-Computer entwickelt wurde. Es enthält viele Scripting-Tools.

Bash-Hülle:

Bash Shell steht für Bourne Again Shell. Die Bash-Shell ist die Standard-Shell in der meisten Linux-Distribution 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 Änderung ausführen und bietet auch Funktionen zur Zeilenbearbeitung.


0
2018-06-25 13:37