Unterschied zwischen sh und bash
Beim schreiben von shell-Programme, die wir verwenden oft /bin/sh
und /bin/bash
. Normalerweise verwende ich bash
, aber ich weiß nicht, was ist der Unterschied zwischen Ihnen.
Was der wesentliche Unterschied zwischen bash
und sh
?
Was müssen wir tun, bewusst sein, wenn die Programmierung in bash
und sh
?
Für eine hilfreiche Liste von bashisms und den entsprechenden code, der funktioniert auf Bourne-shell finden Sie unter mywiki.wooledge.org/Bashism
Möchten Sie vielleicht, um zu sehen, in der POSIX - standard für die sh und der Kommando-Sprache: * sh * Shell Command Language
als Allgemeine Regel gilt, alle sh-Skripte unter bash durch die posix-Kompatibilität, aber nicht alle bash-Skripte ausführen können, unter sh, die wichtigsten Unterschiede, die Sie bemerken, sind Dinge wie [[ ]] anstelle von [ ], die Vergleiche ermöglichen, ohne Anführungszeichen Leerzeichen, $(( )) anstelle von $[ ] arithmetische Ausdrücke und andere Dinge wie "es ist zu groß und zu langsam" direkt aus der bash docs.. Aber neue skriptschreiber braucht nicht beschränken sich auf sh-kompatible Skripte, es sei denn, Sie Schießen für einige rückwärts-Kompatibilität, die mehr als oft nicht, ist nicht der Fall in diesen Tagen, nachdem alle, es ist (oder war...) das Jahr 2014 richtig??
Möchten Sie vielleicht, um zu sehen, in der POSIX - standard für die sh und der Kommando-Sprache: * sh * Shell Command Language
als Allgemeine Regel gilt, alle sh-Skripte unter bash durch die posix-Kompatibilität, aber nicht alle bash-Skripte ausführen können, unter sh, die wichtigsten Unterschiede, die Sie bemerken, sind Dinge wie [[ ]] anstelle von [ ], die Vergleiche ermöglichen, ohne Anführungszeichen Leerzeichen, $(( )) anstelle von $[ ] arithmetische Ausdrücke und andere Dinge wie "es ist zu groß und zu langsam" direkt aus der bash docs.. Aber neue skriptschreiber braucht nicht beschränken sich auf sh-kompatible Skripte, es sei denn, Sie Schießen für einige rückwärts-Kompatibilität, die mehr als oft nicht, ist nicht der Fall in diesen Tagen, nachdem alle, es ist (oder war...) das Jahr 2014 richtig??
InformationsquelleAutor Weiwei Yang | 2011-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist sh
sh
(oder die " Shell Command Language) ist eine Programmiersprache, beschrieben durch die POSIXstandard.
Es hat viele Implementierungen (
ksh88
,dash
, ...).bash
auchals eine Implementierung von
sh
(siehe unten).Weil
sh
ist eine Spezifikation, keine Implementierung,/bin/sh
ist ein symlink(oder ein hard link) auf eine tatsächliche Umsetzung auf den meisten POSIX-Systemen.
Was ist bash
bash
begann als einesh
-kompatible Umsetzung (obwohl es älter ist als die POSIX-standard, der von ein paar Jahren), aber als die Zeit verging, es hat viele Erweiterungen. Viele dieser Erweiterungen kann zu einer Veränderung des Verhaltens gültig POSIX-shell-scripts, also von selbstbash
ist keine gültige POSIX-shell. Es ist vielmehr ein Dialekt von der POSIX-shell-Sprache.bash
unterstützt--posix
Schalter, was macht es POSIX-konform. Es wird auch versucht zu imitieren, POSIX, wenn aufgerufensh
.sh = bash?
Für eine lange Zeit,
/bin/sh
zeigen/bin/bash
auf den meisten GNU/Linux-Systeme. Als Ergebnis, es hatte fast schon ignorieren den Unterschied zwischen den beiden. Aber das änderte sich vor kurzem.Einige populäre Beispiele von Systemen, in denen
/bin/sh
nicht auf/bin/bash
(und von denen einige von der/bin/bash
vielleicht gar nicht vorhanden) sind:sh
zudash
standardmäßig;initramfs
. Es verwendet dieash
shell Umsetzung.pdksh
, ein Nachkomme der Korn-shell. FreeBSDsh
ist ein Nachkomme des original-UNIX-Bourne-shell. Solaris hat seine eigenesh
die für eine lange Zeit war nicht POSIX-konform; eine freie Implementierung verfügbar ist und von dem Erbstück-Projekt.Wie findet man heraus, was
/bin/sh
Punkte auf Ihrem system?Die Komplikation ist, dass
/bin/sh
könnte eine symbolische Verknüpfung oder eine Feste Verknüpfung.Wenn es ein symbolischer link, eine portable Weise zu lösen ist:
Wenn es einen hard-link, versuchen
In der Tat, die
-L
Flagge deckt sowohl symbolische Links und hardlinks,aber der Nachteil dieser Methode ist, dass es nicht tragbar —
POSIX nicht erforderlich
find
zur Unterstützung der-samefile
option,obwohl beide GNU-finden und FreeBSD finden unterstützen.
Shebang Zeile
Letztendlich ist es an Ihnen zu entscheiden, welche Sie verwenden möchten, indem Sie die «shebang» - Zeile.
E. g.
verwenden
sh
(und was auch immer geschieht-zu-Punkt),verwenden
/bin/bash
wenn es verfügbar ist (und mit einer Fehlermeldung fehlschlagen, wenn es nicht). Natürlich können Sie auch angeben, eine andere Umsetzung, z.B., Welche verwendet werden
Für meine eigenen Skripte, die ich lieber
sh
aus folgenden Gründen:bash
Sie sind erforderlich, umsh
Gibt es Vorteile bei der Verwendung
bash
als gut. Seine Eigenschaften machen die Programmierung bequemer und ähnliches zu Programmierung in anderen Programmiersprachen. Dazu gehören Dinge wie der Gültigkeitsbereich von lokalen Variablen und arrays. Plainsh
ist eine sehr minimalistische Programmiersprache./bin/tcsh
als Standard interaktive shell, in/etc/passwd
, nicht, dass Sie verwendentcsh
alssh
Umsetzung.tcsh
hat die C-shell-syntax; es ist nicht auch nur im entferntesten kompatibel mit dem sh POSIX-standard. Siehe freebsd.org/cgi/man.cgi?query=sh&sektion=1 für die Beschreibung des FreeBSDsh
.Vielen Dank für eine tolle Erklärung! Für Referenz, sh != bash auf MacOS als auch.
In der Praxis ist fast jede Umsetzung von
sh
unterstützt lokale Variablen deklariert mit dem Schlüsselwortlocal
.Korays-MacBook-Pro:hello2 koraytugay$ sh --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14) Copyright (C) 2007 Free Software Foundation, Inc. Korays-MacBook-Pro:hello2 koraytugay$ bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14) Copyright (C) 2007 Free Software Foundation, Inc.
Statt
STR =~ REGEX
können Sieecho STR | grep -q REGEX
.InformationsquelleAutor Roman Cheplyaka
sh
: http://man.cx/shbash
: http://man.cx/bashTL;DR:
bash
ist eine Obermenge vonsh
mit einem eleganten syntax und mehr Funktionalität. Es ist sicher zu verwenden, ein bash-shebang-Zeile in fast allen Fällen, es ist ziemlich allgegenwärtig auf modernen Plattformen.NB: in einigen Umgebungen
sh
istbash
. Überprüfen Siesh --version
.Da die bash eine Obermenge der sh und einige OS wie FreeBSD nicht die bash standardmäßig installiert, scripting in sh geben wird, bessere Portabilität.
Da es keine portable-scripts um eine POSIX-shell für ein bestimmtes script, portable Skripte können nicht annehmen, dass mehr als die Bourne-Shell-features.
Auf Ubuntu 16.04.3 LTS den Befehl sh --version schlägt.
InformationsquelleAutor Rein Henrichs
Diese Frage hat Häufig nominiert, als canonical für Menschen, die versuchen, Sie zu nutzen
sh
- und sind überrascht, dass es kein Verhalten das gleiche wiebash
. Hier eine kurze Zusammenfassung der häufigsten Missverständnisse und Fallstricke.First off, Sie sollten verstehen, was zu erwarten ist.
sh scriptname
oder führen Sie es mitscriptname
und haben#!/bin/sh
im shebang line, Sie sollten erwarten, dass POSIXsh
Verhalten.bash scriptname
oder führen Sie es mitscriptname
und haben#!/bin/bash
(oder das äquivalent vor Ort) in der shebang Zeile, die Sie erwarten sollten, Bash Verhalten.Richtigen shebang und läuft das Skript durch Eingabe nur der script-name (möglicherweise mit einem relativen oder vollständigen Pfad) ist in der Regel die bevorzugte Lösung. Neben einer richtigen shebang, erfordert dies die Skript-Datei zu haben, die execute-Berechtigung (
chmod a+x scriptname
).So, wie Sie tatsächlich unterscheiden?
Bash Reference manual hat eine Abschnitt versucht, die Unterschiede aufzählen aber einige gemeinsame Quellen der Verwirrung sind
[[
ist nicht verfügbar insh
(nur[
das ist mehr klobig und begrenzt).sh
keine arrays.local
,source
,function
, undselect
sind nicht tragbar zush
. (Einigesh
Implementierungen supprt z.B.local
.)$'string\nwith\tC\aescapes'
und die drei-argumentfor((i=0;i<=3;i++))
Schleife+=
Inkrement-Zuordnung, etc.<<<'here strings'
.*.{png,jpg}
und{0..12}
brace expansion.Dies ist in POSIX werden, kann aber mising von einigen pre-POSIX -~
bezieht sich auf$HOME
nur in der Bash (und generell~username
home-Verzeichnisusername
)./bin/sh
Implementierungen.<(cmd)
und>(cmd)
.&|
für2>&1 |
und&>
für> ... 2>&1
<>
Umleitung.${substring:1:2}
,${variable/pattern/replacement}
-, Fall-Umbau, etc.Denken Sie daran, dies ist eine gekürzte Liste. Siehe Referenz-Handbuch für die volle Schaufel, und http://mywiki.wooledge.org/Bashism für viele gute übergangslösungen, und/oder versuchen http://shellcheck.net/ die warnt, für viele Bash-only-features.
Ein häufiger Fehler ist es, eine
#!/bin/bash
shebang Zeile, dann aber doch mitsh scriptname
tatsächlich das Skript ausführen. Diese grundsätzlich deaktiviert alle Bash-Funktionalität, so dass Sie erhalten Fehler in der syntax z.B. für versuche zur Verwendung von arrays.Leider, Bash wird nicht warnen, wenn Sie versuchen, diese Konstrukte, wenn es aufgerufen wird
sh
. Es muss nicht komplett deaktivieren alle Bash-Funktionalität, entweder, so läuft die Bash, indem er alssh
ist nicht ein guter Weg, um zu überprüfen, ob dein script richtig portabel zuAsche
/Strich
/POSIXsh
oder Varianten wie Erbstücksh
shellcheck.net, war alles was ich brauchte. vielen Dank.
InformationsquelleAutor tripleee
Post von UNIX.COM
Shell-Funktionen
Diese Tabelle listet die meisten Funktionen, die ich denke, würde Sie wählen Sie eine Schale über der anderen. Es ist nicht beabsichtigt, eine definitive Liste und nicht jedes einzelne feature für jeden einzelnen möglich-shell. Ein feature ist nur dann als in einer shell, wenn in der version, die kommt mit dem Betriebssystem, oder, wenn es verfügbar ist als kompilierte direkt aus der standard-distribution. Insbesondere die C-shell weiter unten angegeben ist, zur Verfügung auf SUNOS 4.*, eine beträchtliche Anzahl von Anbietern, die das Schiff jetzt entweder tcsh oder eigene erweiterte C-shell anstatt (Sie sind nicht immer klar machen, dass Sie Versand tcsh.
Code:
- Taste, um die Tabelle oben.
Y-Funktion kann getan werden mit dieser Schale.
N Feature ist nicht vorhanden in der shell.
F-Funktion kann nur erfolgen, indem die Schalen-Funktion
Mechanismus.
L Die readline-Bibliothek verknüpft werden müssen in der shell zu aktivieren
dieses Feature.
Anmerkungen zu der obigen Tabelle
Lassen Sie mich einige Hinweise: Job-Kontrolle wurde Hinzugefügt, um die Bourne-Shell im Jahr 1989 und der Bourne-Shell wurde aus OpenSource im Jahr 2005. Die Korn-shell verfügt über Prozess-substitution seit mindestens 1988 und es ist OpenSource seit 1997. BTW: deine Aussagen in Bezug auf $ENV sind nicht korrekt, $ENV wird nur gelesen/ausgeführt für interaktive shells.
Dieser Beitrag wurde erfasst von cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
Wenn Sie glauben, es ist falsch, überall, bitte fühlen Sie sich frei zu Bearbeiten es entsprechend.
Basierend auf dem, was schily ausgesetzt, es würde scheinen, dass es besser wäre Sie zu entfernen, diese zu beantworten, als es im Grunde ist betrügerisch, und der OP hat nicht wirklich Tierarzt die Informationen, die er eingefügt.
InformationsquelleAutor SriniV
Shell ist eine Schnittstelle zwischen Benutzer und Betriebssystem für den Zugriff auf eine Betriebssystem-Dienste. Es kann entweder die GUI oder die CLI (Command Line interface).
sh (Bourne shFSL) ist ein shell-command-line-interpreter für Unix/Unix-like Betriebssysteme. Es gibt einige built-in-Befehle. Script-Sprache bezeichnen wir als Dolmetscher
#!/bin/sh
. Es war ein am meisten unterstützt, die von anderen shells wie bash (free/open), kash (nicht kostenlos).Bash (Bourne einegewinnen sHölle) ist eine shell-Ersatz für die Bourne-shell. Bash ist Obermenge der sh. Die Bash unterstützt, sh. POSIX ist ein Satz von standards, die definieren, wie POSIX-kompatiblen Systemen funktionieren sollte. Bash ist nicht wirklich eine POSIX-konforme shell. In einer Script-Sprache bezeichnen wir den interpreter als
#!/bin/bash
.Analogie:
Ich denke, das ist versucht zu sagen, dass Bash erbt von
sh
(es ist also eine "Unterklasse" in der OOP-Sinne) und erweitert (hat also eine Obermenge der Funktionalität).InformationsquelleAutor Premraj
TERMINAL
SHELL
SH Vs. BASH
SH
BASH
REFERENZ MATERIAL:
SHELL
gnu.org:
BASH gnu.org:
InformationsquelleAutor Timothy L.J. Stewart
Anderen Antworten in der Regel darauf hingewiesen, den Unterschied zwischen Bash und eine POSIX-shell-standard. Allerdings, beim schreiben von portablen shell-Skripten und verwendet wird, um die Bash-syntax, eine Liste der typischen bashisms und entsprechende Reine POSIX-Lösungen ist sehr praktisch. Eine solche Liste zusammengestellt wurde, wenn Ubuntu den Wechsel von Bash auf Dash als Standard-system-shell und kann hier gefunden werden:
https://wiki.ubuntu.com/DashAsBinSh
Darüber hinaus gibt es ein tolles tool namens checkbashisms, der überprüft, ob bashisms in Ihrem Skript und kommt praktisch, wenn Sie sicherstellen wollen, dass Ihr script ist portable.
InformationsquelleAutor Andrzej Pronobis
/bin/sh
kann oder kann nicht auf das gleiche Programm/bin/bash
.sh
unterstützt mindestens Funktionen erforderlich, die POSIX (unter der Annahme einer korrekten Implementierung). Es kann die Unterstützung von Erweiterungen als auch.bash
, die "Bourne Again Shell", implementiert die erforderlichen Funktionen für sh-plus-bash-spezifische Erweiterungen. Der vollständige Satz von Erweiterungen ist zu lang hier zu beschreiben, und es ändert sich mit neuen Versionen. Die Unterschiede sind dokumentiert im bash-manual. Geben Sieinfo bash
und Lesen Sie die "Bash-Funktionen" Abschnitt (Abschnitt 6 in der aktuellen version), oder Lesen Sie die aktuelle online-Dokumentation.sh
gibt nur eine POSIX-shell, wenn Sie das Recht habenPATH
in Ihrer aktuellen shell. Es gibt keinen definierten PFAD-Namen, die Ihnen eine POSIX-shell.Für eine lange Zeit,
sh
war nicht unbedingt noch geben Sie eine POSIX-shell auf Solaris, zum Beispiel.InformationsquelleAutor Keith Thompson
bash und sh sind zwei verschiedene shells. Im Grunde bash sh, mit mehr Funktionen und bessere syntax. Die meisten Befehle funktionieren auf die gleiche, aber Sie sind anders.Bash (bash) ist eine von vielen verfügbaren (noch am häufigsten verwendet) Unix-shells. Bash steht für Bourne Again SHell"und ist ein Ersatz/Verbesserung der original-Bourne-shell (sh).
Shell scripting scripting in jeder shell, in der Erwägung, dass die Bash-scripting scripting speziell für die Bash. In der Praxis werden jedoch "shell-script" und "bash-Skript" werden Häufig Synonym verwendet, es sei denn, die shell in Frage ist, nicht Bash.
Gesagt haben, dass, sollten Sie erkennen /bin/sh auf den meisten Systemen wird ein symbolischer link ist und nicht auf sh. Bei Ubuntu /bin/sh verwendet, um die Verknüpfung zu bash, typisches Verhalten auf Linux-Distributionen, aber nun wurde geändert, um eine Verknüpfung zu einer anderen shell namens dash. Ich würde bash, das ist so ziemlich der standard (oder zumindest die meisten common, aus meiner Erfahrung). In der Tat, die Probleme, die entstehen, wenn ein bash-Skript verwenden:#! /bin/sh, da die Skript-maker übernimmt der link auf die bash, wenn Sie es nicht werden.
InformationsquelleAutor Gopika BG
Linux-Betriebssystem bietet verschiedene Arten von shell. Obwohl Muscheln haben viele Befehle gemeinsam, jede Art hat einzigartige Eigenschaften.
Wir studieren verschiedene Arten von hauptsächlich Muscheln.
Sh-shell:
Sh-shell ist auch bekannt als Bourne-Shell. Sh-shell ist die erste shell entwickelt für Unix-Computer von Stephen Bourne im at&T Bell Labs im Jahr 1977. Es gehören viele scripting-tools.
Bash-shell :
Shell Bash steht für Bourne Again Shell. Die Bash-shell ist die Standard-shell bei den meisten linux-distribution und Ersatz für die Sh-Shell (Sh-shell wird auch in der Bash-shell) . Die Bash-Shell ausführen können, die überwiegende Mehrheit der Sh-shell-Skripts ohne änderungen und Befehle Zeile Bearbeiten-Funktion auch.
InformationsquelleAutor rashedcs