Ich bin neu in Shell-Skripten und viele Bücher haben geschrieben, die die Zeile #! (Sha-bang) am Anfang des Skripts verwenden, um den Interpreter aufzurufen. Und dies ruft eine neue Shell für Skripte auf und führt die Interpretation Zeile für Zeile durch. Aber eine meines Basisskripts läuft immer noch ohne die magische Linie.
Meine Fragen sind also:
- Woher hat mein Basisskript den Interpreter?
- Wie hat das Skript den Interpreter gefunden?
Lassen Sie mich Ihnen jetzt etwas über mein Basisskript erzählen, das nur die folgende Zeile enthält:
Echo "Basisskript ohne die magischen Linien"
bash
shell-script
user1678213
quelle
quelle
Antworten:
Wenn die magische Linie nicht angegeben ist, wird eine Standard-Shell zum Ausführen des Skripts verwendet. Diese Standard-Shell kann entweder eine Bourne-Shell (sh) sein, was in einigen Varianten der Fall ist. In einigen anderen Varianten entspricht die verwendete Standard-Shell jedoch der Anmeldeschale, um sie auszuführen. Die Sache ist: Überlassen Sie es nicht dem System, die Shell zu bestimmen, sondern geben Sie immer die gewünschte Shell in der ersten Zeile an.
quelle
/bin/sh
die erstesh
ausführbare Datei ist, die beim Erkunden eines konformen Pfads gefunden wird.Wenn Sie ein Programm ausführen, prüft der Kernel, ob es mit einer magischen Bytesequenz startet . Wenn die ausführbare Datei mit beginnt
#!
, interpretiert der Kernel den Rest der Zeile als Interpreternamen. Wenn die ausführbare Datei mit beginnt\177ELF
(wobei\177
Byte 127 ist), wird die Datei als ausführbare ELF- Datei geladen. Das ist heutzutage die normale Art auf den meisten Unix-Systemen.Wenn der Kernel das Dateiformat nicht erkennt, weigert er sich, die Datei auszuführen, und gibt den Fehler ENOEXEC (Exec format error) zurück. Wenn die Shell dies bemerkt, muss sie das Programm als Shell-Skript ausführen.
Fügen Sie Ihrem Skript einige Befehle hinzu, um dies in Aktion zu beobachten:
(Dies ist für Linux, passen Sie es an andere Unices an.) Versuchen Sie dann, dieses Skript von verschiedenen Shells aus auszuführen. Sie werden sehen, dass einige Shells neue Instanzen von sich selbst
/bin/sh
erzeugen, um das Skript auszuführen (bash, ksh93), während andere erscheinen (dash, pdksh, zsh).quelle
ls -l
Befehl? Dies:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? Wenn ja, was steht darin? Auch bemerkte ichSHELL=/bin/bash
aufenv
, aber ändert es nicht zu ändern Verhalten schien. Vielleicht hat es nichts damit zu tun?ls -l /proc/$$/exe
sollen). Dieexe
Links verweisen auf die Shell, die Ihr Skript ausführt. Wenn Sie Ihr Skript ausführen, werden Sie feststellen, dass es Bash ist, das das Skript interpretiert. Wenn Sie es beispielsweise von pdksh aus ausführen, wird es ausgeführt/bin/sh
. Ich kenne keine Shell, die unterSHELL
diesen Umständen die Umgebungsvariable oder die Login-Shell verwendet./etc/passwd
geändert, welche Shell ausgeführt wird, wenn Sie sich über SSH oder an einer Textkonsole anmelden. Es ändert nichts daran, welche Shell Skripte ausführen kann./etc/passwd
zu entscheiden, welche Shell verwendet werden soll. Sie haben entweder eine Instanz von sich selbst gegabelt oder ausgeführt/bin/sh
.Es ist wahrscheinlich eine der folgenden 3 Möglichkeiten:
Sie rufen das Skript direkt mit dem Interpreter IE: bash script.sh auf
Der Name der Skriptdatei hat die Erweiterung .sh, mit der das System nach dem Standardprogramm für diesen Dateityp sucht
Die Shell-Umgebung, die Sie verwenden, führt das 'Echo' selbst aus, da ich nur vermuten kann, dass die Skriptdatei ausführbar ist. Wenn Sie beispielsweise eine Bash-Shell verwenden und einen Befehl in Ihrer Datei haben, der nur von ksh verwendet wird, werden Sie feststellen, dass dies nicht funktioniert.
Viel Glück!
quelle