Script/Datei ausführen oder ausführbar machen

Bevor man eine Datei ausführen kann, muss sie erstellt werden. Dabei ist es völlig unerheblich, wo die Datei erstellt wird. Am besten macht man es dort, wo man sie am ehesten wiederfindet. Dazu bietet sich das Home-Verzeichnis des Benutzers Pi an: "/home/pi". Dort befindet man sich automatisch, wenn man das Terminal öffnet oder per SSH anmeldet.

Mit welchen Rechten wird die Datei erstellt?

Es gibt grundsätzlich mehrere Möglichkeiten Scripte zu erstellen. Im folgenden zwei Beispiele.
Hier der Hinweis, dass die Dateiendung ".sh" nur andeuten soll, dass es sich um eine Script-Datei handelt. ".sh" bedeutet nicht, dass die Datei zwangsläufig ausführbar ist. Mit der Dateiendung ".sh" macht man nur kenntlich, dass es sich um ein Script handelt. Man könnte ".sh" auch weglassen.

sudo nano test.sh

oder

nano test.sh

Der Unterschied ist, dass beim ersten Kommando die Datei mit Root-Rechten erstellt wird und somit auch nur mit Root-Rechten geändert und ausgeführt werden kann. Selbstverständlich können die Rechte nachträglich geändert werden.
Bei der zweiten Variante ohne "sudo" wird die Datei mit den Rechten des gerade angemeldeten Users erstellt. Bei der Ausführung gelten also auch dessen Rechte.

Was ist jetzt besser? Ein Script mit Root- oder User-Rechten? Es kommt darauf an, was das Script macht. Wenn das Script etwas machen soll, dass für einen bestimmten User relevant ist, dann sollte das Script auch mit den User-Rechten erstellt und ausgeführt werden.
Wenn das Script etwas macht, wobei Root-Rechte erforderlich sind, dann sollte das Script mit Root-Rechten erstellt und später mit Root-Rechten ausgeführt werden.

Ein Benutzer-Script, in dem Kommandos mit "sudo", also mit Root-Rechten, ausgeführt werden müssen, macht nicht so viel Sinn. In so einem Fall wäre es besser, ein Script gleich mit Root-Rechten zu erstellen, wenn in dem Script Kommandos ausgeführt werden, die Root-Rechte brauchen.

Beispiel-Script mit Benutzerrechten erstellen

Zum weiteren Ausprobieren erstellen wir mit dem Editor "nano" eine Script-Datei:

nano test.sh

Oder, wenn das Script mit Root-Rechten ausgeführt werden soll:

sudo nano test.sh

Wenn das Script als Benutzer "root" oder mit "sudo" ausgeführt wird, werden alle darin befindlichen Befehle ebenfalls mit den Rechten des Benutzers "root" ausgeführt. Und somit muss des Kommandos innerhalb des Scriptes KEIN "sudo" vorangestellt werden.

Im Editor tragen wir folgende Zeile ein:

echo "Test"

Anschließend speichern und schließen: Strg + O, Return, Strg + X.

Nachdem das Script erstellt wurde, stellt sich die Frage, wie man das Script ausführt bzw. ausführbar macht.

Script ausführen

Die einfachste Möglichkeit ein Script auszuführen ist, die Datei an einen geeigneten Interpreter zu übergeben. Der Interpreter ist ein Programm, dass die Datei aufruft und die darin enthaltenen Befehle abarbeitet. Man kann allerdings nicht jeden Interpreter verwenden. Die im Script enthaltenen Befehle müssen schon zum Interpreter passen. In diesem Fall ist es der Bash-Interpreter.

Der Aufruf für dieses Bash-Script lautet wie folgt:

bash test.sh

Dieses Kommando ruft den Bash-Interpreter auf und übergibt ihm den Dateinamen des auszuführenden Scripts. Hier ist wichtig, dass sich die Datei im aktuellen Verzeichnis befindet.
Das Beispiel-Script macht dann nichts anderes, als "Test" auf der Kommandozeile auszugeben.

Der Nachteil bei diesem Kommando ist, dass man den Interpreter zum Script wissen und eingeben muss. Nur weil die Datei auf ".sh" endet, bedeutet das nicht, dass es sich um ein sh-Script handelt. Aus diesem Grund macht man ein Script in der Regel ausführbar, was es im ersten Moment aufwändiger, aber später einfacher macht.

Script ausführbar machen

In der Regel ruft man ein Script nicht über einen geeigneten Interpreter, sondern macht die Datei ausführbar.
Wenn das Script mit Root-Rechten als User "root" oder als Benutzer mit "sudo" erstellt wurde:

sudo chmod +x test.sh

Wenn das Script mit Benutzer-Rechten erstellt wurde (ohne sudo):

chmod +x test.sh

Das "ausführbar machen" reicht aber nicht aus. Denn je nach Konfiguration der Kommandozeile geht diese davon aus, dass es sich standardmäßig um ein Bash-Script handelt.

./test.sh

Wenn das nicht funktioniert, dann fehlt noch das richtige "Shebang". Es handelt sich dabei um die erste Zeile im Script, dass bei der Ausführung auf den richtigen Interpreter hinweist.
Das richtige "Shebang" ist vom Interpreter abhängig:

  • Bash: #!/bin/bash
  • Perl: #!/usr/bin/perl
  • Python: #!/usr/bin/python
  • ...

Wir gehen im weiteren davon aus, dass es sich bei unserem Test-Script um ein "Bash-Script" handelt. In der ersten Zeile muss also "#!/bin/bash" stehen. Dazu öffnen wir die Script-Datei.

nano test.sh

Zusätzlich fügen wir in der ersten Zeile folgendes ein:

#!/bin/bash

Anschließend speichern und schließen: Strg + O, Return, Strg + X.

Danach können wir das Script ausführen:

./test.sh

"./" führt dazu, dass die Datei ausgeführt wird. Der richtige Interpreter wird dabei aus der ersten Zeile des Scripts ermittelt (Shebang).
Aber, nur weil ein "Shebang" gesetzt ist, bedeutet das nicht, dass die Datei ausführbar ist. Damit der "Shebang" genutzt wird, muss die Datei auch ausführbar gemacht sein (siehe oben).

Zusammenfassung

Es gibt zwei Möglichkeiten ein Script auszuführen. Entweder führt man das Script über den Interpreter aus, wobei ein enthaltendes "Shebang" in der Datei ignoriert wird.

bash test.sh

Oder man macht die Datei ausführbar und setzt den richtigen Interpreter im "Shebang".

chmod +x test.sh

Aber nur weil ein "Shebang" gesetzt ist, bedeutet das nicht, dass die Datei ausführbar ist. Damit der "Shebang" genutzt wird, muss die Datei ausführbar sein.

Anschließende kann man die Datei ausführen. Vorausgesetzt der richtige "Shebang" ist gesetzt, dann klappt das auch.

./test.sh

Welche Form der Ausführung man wählt, ob mit Interpreter oder als ausführbare Datei und "Shebang", ist im Prinzip unerheblich.

Speicherort für Scripte

Wohin speichert man sinnvollerweise eigene Shell-Scripte? Linux kennt hierfür spezielle Verzeichnisse.

  • System-Scripte mit Root-Rechten: "/usr/local/sbin"
  • Allgemeine User-Scripte mit Benutzer-Rechten: "/usr/local/bin"

Diese und noch weitere Verzeichnisse sind standardmäßig in der globalen Variable "$PATH" enthalten. Wenn man in diesen Verzeichnisse eine Datei anlegt und ausführbar macht, dann muss man deren Verzeichnis nicht angeben. Es wird automatisch erkannt.

Kopieren Sie das Beispiel-Script:

sudo mv test.sh /usr/local/bin

Führen Sie es anschließend aus:

test.sh

Hier ist wichtig, dass das Script ausführbar ist und das "Shebang" enthält.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Elektronik-Set Raspberry Pi Edition
Elektronik-Set Raspberry Pi Edition

Elektronik erleben mit dem Raspberry Pi mit Python und GPIO Zero

  • Leichter Einstieg ins Hardware-nahe Programmieren mit Python und GPIO Zero
  • Experimentieren und Programmieren ohne Vorkenntnisse
  • Sofort Loslegen mit All-in-one-Set

Elektronik-Set jetzt bestellen

Elektronik-Fibel

Elektronik einfach und leicht verständlich

Die Elektronik-Fibel ist ein Buch über die Grundlagen der Elektronik, Bauelemente, Schaltungstechnik und Digitaltechnik.

Das will ich haben!