Der Shebang – bash Tutorial Teil 20

Unsere bash führt immer nativ für Linux compilierte Kommandos (wie z.B. ls) oder bash-Skripts aus. Mit dem Shebang lassen sich aber beliebige Skriptsprachen wie ein normales Kommando ausführen.

Dr. Dirk Colbry, Michigan State
Gnu-bash-logoCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia)

shebang

Der Shebang ist nichts magisches sondern nur eine Anweisung, die in die erste Zeile einer Textdatei gesetzt wird. Sie enthält Informationen darüber, wie die bash mit dem nachfolgenden Text umgehen soll.

1Einführung
2Der bash Prompt
3key bindings
4Der Startvorgang
5Environment Variablen
6builtin commands
7Arbeiten mit Dateien
8nano
9bash Scripting
10Variablen
11Verzweigungen (if)
12Schleifen
13Kommandozeilenparameter
14exit Codes bash Tutorial Teil 14
15von der Idee zum Script
16grep
17Piping und Redirection
18tee
19alias
20Der Shebang

Shebang definieren

Nehmen wir mal ein einfaches Hello World Programm in Python.

def main():
    print("Hallo von Python!")


if __name__ == "__main__":
    main()

Es macht nicht viel außer dem Text Hallo von Python! auf der Console auszugeben. Um es auszuführen, musst du den Pythoninterpreter aufrufen, um den Pythoncode zu übersetzen

python hello.py

Dies ist auf die Dauer lästig. Besser wäre es, den Interpreter automatisch aufrufen zu lassen. Da kommt jetzt der SheBang ins Spiel.

Er wird immer in die allererste Zeile des Codes geschrieben und wird immer mit #! eingeleitet. Danach folgt das Programm, das die nachfolgende Datei abarbeiten soll. Die bash besitzt keinen eignen Mechanismus, um den Dateityp zu bestimmen und entsprechend zu reagieren.

Machen wir jetzt unser Pythonprogramm zunächst mal ausführbar

chmod u+x hello.py

Jetzt können wir hello.py einfach als Kommando starten.

Fehlermeldungen bei der Ausführung von hello.py
raspithek.de - Olli Graf
python-no-shebangCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Fehlermeldungen bei der Ausführung von hello.py

Die bash versucht den Pythoncode als bash Script zu interpretieren und bricht dann mit Syntaxfehlern ab.

Jetzt ergänzen wir den Shebang als erste Zeile wie folgt: #! /usr/bin/python

#! /usr/bin/python
# Datei: hello.py

def main():
    print("Hallo von Python")


if __name__ == "__main__":
    main()

Jetzt können wir hello.py ganz normal als Kommando ausführen, da die bash weiß, dass sie den Pythoninterpreter starten muss, um die Datei zu interpretieren.

Mit der Shebang Zeile wird hello.py problemlos ausgeführt.
raspithek.de - Olli Graf
python-with-shebangCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Mit der Shebang Zeile wird hello.py problemlos ausgeführt.

Andere Interpreter

Der Shebang ist nicht nur auf Python beschränkt, er lässt sich für jede Programmiersprache einsetzen. Im folgenden haben wir das Hello World in Javascript

#! /usr/bin/node
// Datei: hello.js

console.log('Hallo von JavaScript')

Der Shebang definiert bereits Node.js als Interpreter, diesen muss ich allerdings erst noch mit

sudo apt install nodejs -y

auf meinem Raspberry Pi installieren.

Auch hello.js mache ich ausführbar

chmod u+x hello.js

Wenn ich das jetzt mit ./hello.js starte, ruft die bash node auf um das JavaScript zu interpretieren.

Ausführen von hello.js
raspithek.de - Olli Graf
js-with-shebangCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Ausführen von hello.js

Eigener Shebang

Ich wollte mal experimentell sehen, was bei einem Shebang im Hintergrund passiert und habe mir ein kleines Script dazu geschrieben:

#! /usr/bin/bash
# Datei: mybang

echo "0:${0}"
echo "1:${1}"
echo "2:${2}"

Er gibt einfach nur die ersten drei Parameter aus. In hello.py ändere ich den Shebang in #! ./mybang und rufe das Programm erneut auf. Ich habe bei Tests herausgefunden, dass hier zwingend ein Shebang auf die bash definiert werden muss.

usführung von hello.py mit dem eigenen Shebang
raspithek.de - Olli Graf
python-with-mybangCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Ausführung von hello.py mit dem eigenen Shebang

Die ersten drei Parameter sind dann wie folgt gesetzt:

  • 0 enthält wie üblich den Namen des laufenden Scripts,
  • 1 enthält den Namen der zu interpretierenden Datei mit Pfad.
  • ab 2 sind die Parameter leer.

Was kann man mit diesem Wissen anfangen? Es wäre jetzt möglich, den eigenen Shebang so zu erweitern, dass nur bestimmte User Pythoncode mit Shebang ausführen darf.

#! /usr/bin/bash
# Datei: mybang

echo "0:${0}"
echo "1:${1}"
echo "2:${2}"

if [[ "${USER}" == "pi" ]]; then
    echo "User pi darf python ausführen."
    python ${1}
else
    echo "Du darfst kein Python ausführen."
fi

Genauso könnten wir einen universellen Shebang schreiben, der anhand der Dateiendung entscheidet, welcher Interpreter aufgerufen wird. Aber das machen nur schlechte Programmierer 😉

ello.py wird mit Zugriffskontrolle ausgeführt.
raspithek.de - Olli Graf
python-with-access-controlCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
hello.py wird mit Zugriffskontrolle ausgeführt.

Zum Schluss noch der Link zum Git-Repository.

Schreibe einen Kommentar

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert
Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner