GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum müssen Sie #!/bin/bash an den Anfang einer Skriptdatei setzen?

Es ist eine Konvention, damit die *nix-Shell weiß, welche Art von Interpreter ausgeführt werden soll.

Ältere Varianten von ATT waren beispielsweise standardmäßig sh (die Bourne-Shell), während ältere Versionen von BSD standardmäßig auf csh gesetzt haben (die C-Shell).

Sogar heute (wo die meisten Systeme Bash ausführen, ist die "Bourne Again Shell" ), Skripte können in bash, python, perl, ruby, PHP usw. usw. vorliegen. Zum Beispiel könnten Sie #!/bin/perl sehen oder #!/bin/perl5 .

PS:Das Ausrufezeichen (! ) wird liebevoll "Bang" genannt . Das Shell-Kommentarsymbol (# ) wird manchmal "Hash" genannt .

PPS:Denken Sie daran - unter *nix ist die Zuordnung eines Suffixes zu einem Dateityp lediglich eine Konvention , keine "Regel" . Eine ausführbare Datei kann ein binäres Programm sein, jeder von Millionen Skripttypen und auch andere Dinge. Daher die Notwendigkeit für #!/bin/bash .


Genauer gesagt der Shebang #! , wenn es sich um die ersten beiden Bytes einer ausführbaren Datei handelt (x mode)-Datei, wird vom Systemaufruf execve(2) interpretiert (der Programme ausführt). Aber POSIX-Spezifikation für execve erwähne nicht den Kram.

Darauf muss ein Dateipfad einer ausführbaren Interpreterdatei folgen (die übrigens sogar relativ sein könnte, aber meistens absolut ist).

Ein netter Trick (oder vielleicht nicht so netter), um einen Interpreter zu finden (z. B. python ) im $PATH des Benutzers ist die Verwendung des env Programm (immer bei /usr/bin/env auf allen Linux) wie z.B.

 #!/usr/bin/env python

Jede ausführbare ELF-Datei kann ein Interpreter sein. Sie könnten sogar #!/bin/cat verwenden oder #!/bin/true wenn du wolltest! (aber das wäre oft nutzlos)


Es heißt Shebang. Im Unix-Jargon heißt # scharf (wie in der Musik) oder hash (wie Hashtags auf Twitter) und ! heißt Knall. (Sie können tatsächlich mit !! auf Ihren vorherigen Shell-Befehl verweisen, der als Bang-Bang bezeichnet wird). Zusammen ergibt das also HaSH-BANG oder Shebang.

Der Teil nach dem #! teilt Unix mit, welches Programm es verwenden soll, um es auszuführen. Wenn es nicht angegeben ist, wird es mit bash (oder sh oder zsh oder was auch immer Ihre $SHELL-Variable ist) versuchen, 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.


Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Warum erkennt das Bash-Skript keine Aliase?

  3. Was ist der Unterschied zwischen /sbin/nologin und /bin/false?

  4. Wie überprüfe ich die Teilzeichenfolge in Shell Script Bash?

  5. Gibt es einen Grund, einen Shebang zu haben, der auf /bin/sh statt auf /bin/bash zeigt?

Woher weiß ich den Namen der Skriptdatei in einem Bash-Skript?

Was ist der Unterschied zwischen #!/usr/bin/env bash und #!/usr/bin/bash?

Führen Sie den Bash-Befehl auf der Jenkins-Pipeline aus

Welche Größen sollten Sie /, /boot, /home und swap zuweisen

Wann muss ich #!/bin/bash und wann #!/bin/sh verwenden?

Chroot schlägt fehl - Befehl `/bin/bash' kann nicht ausgeführt werden:Keine solche Datei oder Verzeichnis