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, dasssh
eine symbolische Verknüpfung zudash
und nicht zubash
. 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
unddash
? - Beide verwenden die Bourne-Shell-Syntax. Wie ich in meiner Antwort schrieb, ist
dash
eine saubere Implementierung des POSIX-Shell-Standards. Andererseits istbash
eine Shell mit einer großen Anzahl von Erweiterungen und nicht standardmäßigen Funktionen, von denen einige vonksh
,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