Ich habe schon einmal Bash- Skripte erstellt und alle liefen #!/bin/bash
am Anfang ohne .
Was bringt es, es einzubauen? Würden die Dinge anders sein?
Wie spricht man auch aus #
? Ich weiß, dass !
das als "Knall" ausgesprochen wird.
Wie wird #!
ausgesprochen?
./yourscript.extension
für ausführbare Dateien setzen und dann beispielsweise./helloworld.py
oder./helloworld.sh
eingeben, wird in dieser obersten Zeile nach dem Interpreter gesucht. Dies ist#!/bin/python
oder!#/bin/bash
, während bei der Ausführung des Skriptspython helloworld.py
die erste Zeile nicht beobachtet wird, da sie kommentiert ist aus. Es ist also eine spezielle Sequenz für die Shell / den Kernel.Antworten:
Es ist eine Konvention, damit die * nix-Shell weiß, welche Art von Interpreter ausgeführt werden soll.
Beispielsweise waren ältere ATT- Varianten standardmäßig sh (die Bourne-Shell), während ältere BSD-Versionen standardmäßig csh (die C-Shell) waren.
Auch heute (wo die meisten Systeme bash laufen, die "Bourne Again Shell" ) kann, Skripte in bash sein, Python, Perl, Rubin, PHP, etc, etc. Zum Beispiel könnten Sie sehen ,
#!/bin/perl
oder#!/bin/perl5
.PS: Das Ausrufezeichen (
!
) heißt liebevoll "Knall" . Das Shell-Kommentarsymbol (#
) wird manchmal als "Hash" bezeichnet .PPS: Denken Sie daran - unter * nix ist das Zuordnen eines Suffix zu einem Dateityp lediglich eine Konvention , keine "Regel" . Eine ausführbare Datei kann ein Binärprogramm sein, einer von einer Million Skripttypen und andere Dinge. Daher die Notwendigkeit für
#!/bin/bash
.quelle
execve(2)
Systemaufrufs interpretiert . Der Shebang ist also eine Kernel- Konvention, keine Shell-Konvention.#!/bin/sh
Dinge wie.profile
und Dinge hinzufügen müssen , die unter Last laufenGenauer gesagt wird der Shebang
#!
, wenn es sich um die ersten zwei Bytes einer ausführbaren (x
Modus- ) Datei handelt, vom Systemaufruf execve (2) (der Programme ausführt) interpretiert . Aber die POSIX-Spezifikation fürexecve
erwähnt den Shebang nicht.Es muss ein Dateipfad einer ausführbaren Interpreter-Datei folgen (der übrigens sogar relativ sein kann, aber meistens absolut ist).
Ein netter Trick (oder vielleicht nicht so netter ), um einen Interpreter (zB
python
) im Benutzer zu finden,$PATH
ist die Verwendung desenv
Programms (immer unter/usr/bin/env
Linux) wie zJede ausführbare ELF-Datei kann ein Interpreter sein. Sie könnten sogar verwenden
#!/bin/cat
oder#!/bin/true
wenn Sie wollten! (aber das wäre oft nutzlos)quelle
#!/usr/bin/env
Hacks.#!/usr/bin/env bash -x
. Wie mache ich das ?#!/usr/bin/env bash -x
bash
ist fast immer/bin/bash
so, dass Ihr Schebang sein sollte#!/bin/bash -x
Es heißt Shebang . In Unix-Sprache heißt # scharf (wie in der Musik) oder Hash (wie Hashtags auf Twitter) und! heißt Knall. (Sie können Ihren vorherigen Shell-Befehl tatsächlich mit !! referenzieren, genannt Bang-Bang). Zusammen ergibt sich also haSH-BANG oder Shebang.
Der Teil nach dem #! teilt Unix mit, welches Programm zum Ausführen verwendet werden soll. Wenn es nicht angegeben ist, wird es mit bash (oder sh oder zsh oder was auch immer Ihre $ SHELL-Variable ist) versucht, aber wenn es dort ist, wird es dieses Programm verwenden. Außerdem ist # in den meisten Sprachen ein Kommentar, sodass die Zeile bei der nachfolgenden Ausführung ignoriert wird.
quelle
execve(2)
syscall verwendet die$SHELL
Variable nicht. Es ist der Kernel, der den Shebang interpretiert.Der Shebang ist eine Anweisung an den Loader, das Programm zu verwenden, das nach dem
#!
als Interpreter für die betreffende Datei angegeben ist, wenn Sie versuchen, es auszuführen. Also, wenn Sie versuchen , eine Datei mit dem Namen laufen zu lassen ,foo.sh
das hat#!/bin/bash
an der Spitze, den eigentlichen Befehl, der ausgeführt ist/bin/bash foo.sh
. Dies ist eine flexible Möglichkeit, verschiedene Interpreter für verschiedene Programme zu verwenden. Dies wird auf Systemebene implementiert, und die API auf Benutzerebene ist die Shebang-Konvention.Es ist auch wichtig zu wissen, dass der Shebang eine magische Zahl ist - eine von Menschen lesbare Zahl , die die Datei als Skript für den angegebenen Interpreter identifiziert.
Ihr Punkt, dass es auch ohne den Shebang "funktioniert", ist nur, weil das fragliche Programm ein Shell-Skript ist, das für dieselbe Shell geschrieben wurde wie die, die Sie verwenden. Zum Beispiel könnten Sie sehr gut eine Javascript-Datei schreiben und dann eine
#! /usr/bin/js
(oder etwas Ähnliches) einfügen, um ein Javascript "Shell-Skript" zu haben.quelle
Das Betriebssystem verwendet die Standard-Shell, um Ihr Shell-Skript auszuführen. Wenn Sie also den Shell-Pfad am Anfang des Skripts erwähnen, bitten Sie das Betriebssystem, diese bestimmte Shell zu verwenden. Es ist auch nützlich für die Portabilität .
quelle
Jede Distribution hat eine Standard-Shell. Bash ist die Standardeinstellung auf den meisten Systemen. Wenn Sie zufällig auf einem System mit einer anderen Standard-Shell arbeiten, funktionieren die Skripte möglicherweise nicht wie beabsichtigt, wenn sie speziell für Bash geschrieben wurden.
Bash hat sich im Laufe der Jahre weiterentwickelt und Code von
ksh
und übernommensh
.Wenn Sie
#!/bin/bash
als erste Zeile Ihres Skripts hinzufügen, wird das Betriebssystem angewiesen, die angegebenenshell
Befehle aufzurufen , um die im Skript folgenden Befehle auszuführen.#!
wird oft als "Hash-Bang", "She-Bang" oder "Sha-Bang" bezeichnet.quelle
Es heißt Shebang . Es besteht aus einem Zahlenzeichen und einem Ausrufezeichen (#!), Gefolgt vom vollständigen Pfad zum Interpreter wie / bin / bash. Alle Skripte unter UNIX und Linux werden mit dem in der ersten Zeile angegebenen Interpreter ausgeführt.
quelle
Außerdem sehen Sie nach #! / Bin / bash einige andere Parameter.
#!/bin/bash -v -x
Lesen Sie diese beispielsweise, um mehr über die Idee zu erfahren.
/unix/124272/what-do-the-arguments-v-and-x-mean-to-bash .
quelle
Dies kann für jemanden nützlich sein, der ein anderes System verwendet, für das diese Bibliothek nicht verfügbar ist. Wenn dies nicht deklariert ist und Sie einige Funktionen in Ihrem Skript haben, die von diesem System nicht unterstützt werden, sollten Sie # / bin / bash deklarieren. Ich bin vor der Arbeit auf dieses Problem gestoßen, und jetzt füge ich es nur als Übung hinzu.
quelle