Was ist der Unterschied zwischen der Verwendung von bash und sh zum Ausführen eines Skripts?

Führen bash und sh ein Skript unterschiedlich aus? Ich habe ein Shell-Skript mit bash und sh ausgeführt und die gleiche Ausgabe erhalten. Was ist der Unterschied?

Wenn Sie nur ./executable ausführen, wird bash oder sh verwendet?

Kommentare

  • @Pandya Die Variable $SHELL wird nicht verwendet, um zu entscheiden, welche Shell die ./executable interpretiert Skript. ' sagt nicht unbedingt aus, was die aktuelle Shell ist.
  • @jlliagre oh! OK. wiki.debian.org sagt " SHELL = Die aktuelle Shell. "
  • @Pandya sollte eigentlich " sagen. Die Anmeldeshell des Benutzers ' ". Die aktuelle Shell kann unterschiedlich sein.

Antwort

Das hängt von dem System ab, das Sie ausführen. Bei vielen Betriebssystemen, insbesondere unter Linux, ist sh ein Link zu bash.

In diesem Fall gibt es Es gibt immer noch einige Verhaltensunterschiede, bei denen bash versucht, dem Namen sh ähnlicher zu werden, aber die meisten Bashismen akzeptiert werden.

Auf einigen anderen Betriebssystemen, wie Debian-basierten, wird sh von dash bereitgestellt, nicht von bash. Dies macht einen viel größeren Unterschied, da dash keine Bashismen unterstützt und als saubere POSIX-Shell-Implementierung konzipiert ist.

Auf proprietären Betriebssystemen sh wird häufig entweder von einem POSIX-kompatiblen ksh88 bereitgestellt, das wie dash keine Bashismen implementiert. Unter Solaris 10 und älter ist sh wahrscheinlich eine ältere Bourne-Shell, die älter ist als POSIX.

In jedem Fall haben Sie wahrscheinlich Dieselbe Ausgabe mit Ihrem Test, einfach weil Ihr Skript keinen bash spezifischen Befehl, Option oder Syntax verwendet hat.

Wenn Sie , welche Shell ausgeführt wird, hängt im Wesentlichen von dem Shebang ab, der am Anfang des ausführbaren Skripts geschrieben wurde. Dies ist bash, wenn der Shebang dies angibt:

#!/bin/bash .... 

Wenn kein Shebang vorhanden ist und Sie das Skript aufrufen Von einer POSIX-kompatiblen Shell aus sollte das Skript technisch von der ersten sh ausgeführt werden, die im PATH gefunden wurde. Viele Shell-Interpreter wie bash, dash und ksh betrachten sich selbst als POSIX Interpretieren Sie das Skript. Beachten Sie, dass die Umgebungsvariable SHELL hier nicht verwendet wird.

Kommentare

  • Ich habe mich in /bin und ich stellte fest, dass sh eine symbolische Verknüpfung zu dash und nicht zu bash. Wie liefen sie gleich? ' führte keine Bash-Skriptbefehle aus, sondern nur Terminalbefehle, um andere Pakete zu verwenden. ' -Tools.
  • Wenn Ihr Shell-Skript nur nacheinander andere Befehle aufruft, wird es von jedem Shell-Interpreter mit demselben Ergebnis ausgeführt. Hier ist nichts Unerwartetes.
  • Dies ist nicht ' nicht mit der Frage verbunden, aber was genau ist der Unterschied zwischen bash und dash?
  • Beide verwenden die Bourne-Shell-Syntax. Wie ich in meiner Antwort schrieb, ist dash eine saubere Implementierung des POSIX-Shell-Standards. Andererseits ist bash eine Shell mit einer großen Anzahl von Erweiterungen und nicht standardmäßigen Funktionen, von denen einige von ksh, ksh93 und andere Shells und einige Bash-spezifische, sogenannte Bashismen. Es gibt ein Tool namens checkbashisms, mit dessen Hilfe alles identifiziert werden kann, was in einem bestimmten Shell-Skript nicht unbedingt portierbar ist.

Antwort

Ja, es könnte sein, aber es muss nicht sein. Die beiden Schalen sind nicht gleich, aber die Grundlagen sind kompatibel. Überprüfen Sie diesen Beitrag auf weitere Details.

Sie können die folgende Zeile in einem Skript verwenden, um den verwendeten Interpreter zu überprüfen:

ps h -p $$ -o args="" | cut -f1 -d" " 

Sie können die Shell explizit angeben, die verwendet werden soll, wenn das Skript direkt mit der Zeile sheebang ausgeführt wird:

#!/bin/sh 

oder

#!/bin/bash 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.