AA-dotslash.jpg

© Computec Media GmbH

Basiswissen zum Ausführen von eigenen Skripten

Punkt vor Strich

Viele Linux-Einsteiger stolpern bei den ersten Schritten im Terminal über den Punkt, dass man beim Aufruf von eigenen Skripten oder Programmen ein <c>./<c> voransetzen muss. Was hat es mit diesem Dotslashs eigentlich auf sich?

Die Zeichenkombination ./ – also ein Punkt ("dot") gefolgt von einem Schrägstrich ("slash") – dürfte den meisten erfahrenen Linux-Anwendern als Präfix vor Befehlen bekannt sein. Besonders Linux-Einsteiger stolpern jedoch über diese Kombination, wenn es darum geht, ein Programm oder Skript auszuführen, das im aktuellen Verzeichnis der Shell liegt. Doch was steckt hinter dieser kryptischen Zeichenfolge, und warum müssen Sie sie eigentlich immer eingeben? Wir bringen mit diesem Artikel ein wenig Licht in die Sache.

Bevor wir allerdings zum Thema ./ kommen, müssen wir erst einmal ein wenig ausholen und einige Worte zur Linux-Shell und der Umgebungsvariable $PATH verlieren. Eine Shell stellt im Grunde ein relativ einfaches Programm dar, das eine textbasierte Benutzerschnittstelle lädt, in die der Benutzer seine Befehle eingibt, die dann letztendlich von der Shell ausgeführt werden. Neben der weitverbreiteten Bourne-Again-Shell Bash gibt es noch weitere Shells, wie etwa die komfortable Z-Shell Zsh – wir konzentrieren uns jedoch auf die Bash.

Beim Aufruf eines Befehls führt die Shell entweder ein fest eingebautes Kommando aus oder startet ein ausführbares Programm oder Skript, das sich irgendwo auf der Festplatte befindet. Zur ersten Gruppe gehören Befehle wie etwa cd, echo, kill oder alias. Sie sind fest in der Shell integriert, es gibt also nirgends eine Programmdatei zum Kommando. Im Gegensatz dazu stehen ausführbare Programme wie mv, less oder große Anwendungen wie gedit oder firefox, deren ausführbare Programmdateien meist im Verzeichnis /usr/bin/ liegen.

Geben Sie nun einen Befehl in die Shell ein, so durchsucht diese erst einmal die in der Shell-Variablen $PATH (Listing 1) aufgeführten Verzeichnisse nach dem eingegebenen Programm. Dabei kommt die Reihenfolge der Einträge zum Tragen. Sucht die Shell etwa anhand des Pfads aus Listing 1 nach dem Programm foo und spürt die entsprechende Datei in /usr/local/bin auf, dann führt sie /usr/local/bin/foo aus – selbst wenn es in /usr/bin/ ebenfalls ein Programm namens foo gäbe. Erst wenn die Suche im Pfad keinen Treffer liefert, führt die Shell ein eventuell passendes internes Kommando aus. Diesen Punkt gilt es, im Hinterkopf zu behalten.

Listing 1

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Skripte ausführen

Nun schließen wir den Bogen zu ./ und beschäftigen uns mit dem Ausführen von Programmen und Skripten. Sie möchten also ein selbst geschriebenes Skript oder ein als Binary heruntergeladenes Programm aufrufen. Als Beispiel wählen wir ein Skript namens beispiel.sh im Verzeichnis tmp/ innerhalb Ihres Home-Verzeichnisses. Ohne große Überlegung wechseln wir mit cd in das Verzeichnis, machen das Skript ausführbar und prüfen mit ls, ob auch das Executable-Bit gesetzt wurde. Rufen Sie dann das Skript auf, passiert – nichts: Die Shell meldet command not found (Listing 2).

Listing 2

tux@computer:~$ cd tmp
tux@computer:~/tmp$ chmod +x beispiel.sh
tux@computer:~/tmp$ ls -al beispiel.sh
-rwxr-xr-x 1 tux tux 61 2010-02-03 15:28 beispiel.sh
tux@computer:~/tmp$ cat /beispiel.sh
#!/bin/bash
echo "Dies ist nur ein Beispiel für ein Skript."
tux@computer:~/tmp$ beispiel.sh
beispiel.sh: command not found

Die Shell meint also, das Skript nicht finden zu können – und das, obwohl wir uns im richtigen Verzeichnis befinden, das Skript dort auch tatsächlich liegt und zudem auch die Rechte stimmen. Eigentlich müsste die Shell unser Beispiel-Skript also ausführen – warum klappt das nicht? Des Rätsels Lösung liegt im vorhin beschriebenen $PATH: Sehen Sie sich noch einmal das Listing 1 an.

Die Shell stellt fest, dass sich in den in $PATH aufgeführten Verzeichnissen nirgendwo ein Programm namens beispiel.sh befindet. Auch die Suche nach einem internen Kommando mit diesem Namen liefert keinen Treffer. Als Letztes müsste die Shell also im aktuellen Verzeichnis nachsehen, doch das tut sie nicht. Stattdessen quittiert sie den Programmaufruf direkt nach der Suche im Pfad und in den internen Kommandos.

Um also unser Beispielskript beispiel.sh auszuführen, müssten Sie dieses entweder in ein Verzeichnis innerhalb von $PATH kopieren oder dem Aufruf auch den vollständigen Pfad zur Datei mitgeben. Drei mögliche, funktional identische Pfadangaben dazu zeigt Listing 3.

Listing 3

tux@computer:~/tmp$ /home/tux/tmp/beispiel.sh
Dies ist nur ein Beispiel für ein Skript.
tux@computer:~/tmp$ $HOME/tmp/beispiel.sh
Dies ist nur ein Beispiel für ein Skript.
tux@computer:~/tmp$ ~/tmp/beispiel.sh
Dies ist nur ein Beispiel für ein Skript.

Wie Sie sehen, gibt es also mehrere Varianten, um den Pfad zu einer Datei anzugeben, wie etwa die Tilde ~ mit dem Pfad zum Home-Verzeichnis des aktuellen Benutzers. Die kürzeste Variante, um einen Pfad zum aktuellen Verzeichnis anzugeben, ist ein schlichter Punkt. Zwei Punkte hintereinander verweisen dann auf das Elternverzeichnis – das Prinzip kennen Sie sicher schon vom Aufruf cd ... Stecken Sie in der Shell nun bereits im Verzeichnis mit der ausführbaren Datei, genügt zum Start der beispiel.sh eben ein Dotslash ./ als Pfadangabe (Listing 4).

Listing 4

tux@computer:~$ cd tmp
tux@computer:~/tmp$ ./beispiel.sh
Dies ist nur ein Beispiel für ein Skript.

Sicherheit vor Bequemlichkeit

Sie stellen sich nun mit Sicherheit die Frage, warum das aktuelle Verzeichnis nicht von Haus aus im Pfad steckt – bei der Microsoft-Eingabeaufforderung klappt das ja auch. Dem Anwender würde viel Tipparbeit und vor allen Dingen besonders beim Linux-Einstieg Verwirrung erspart bleiben. Der Grund dafür ist simpel: Es geht um Sicherheit.

Gehen wir von dem nicht unwahrscheinlichen Fall aus, dass Sie von einer Person einen USB-Stick mit einer ganzen Reihe von Dateien erhalten haben, die Sie per Shell-Kommando auf Ihr System kopieren möchten. Die Aufgabe sollte selbst Linux-Einsteiger vor keine großen Herausforderungen stellen: Sie wechseln mit cd ins entsprechende Verzeichnis auf dem USB-Stick und verschieben dann mit dem Kommando mv die Daten auf die Festplatte (Listing 5).

Listing 5

tux@computer:~$ cd /media/usb-stick
tux@computer:/media/usb-stick$ mv beispiel.* /wohin/auch/immer

Was aber, wenn auf dem USB-Stick ebenfalls eine Datei mv läge, mit dem Inhalt aus Listing 6? Würde die Shell das aktuelle Verzeichnis nicht ignorieren, dann käme statt des eigentlich gewünschten Kommandos /usr/bin/mv das lokal lagernde, heimtückische Skript zur Ausführung. Sie würden mit der Dateioperation nicht die Daten auf die Festplatte schieben, sondern Ihr gesamtes Home-Verzeichnis unwiederbringlich ins Nirvana senden, ohne etwas davon zu bemerken – bis es zu spät wäre.

Listing 6

#!/bin/bash
echo "mv mich und ich lösch dich!"
rm -rf $HOME

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Bash-Skripte sind Programme
    Wer regelmäßig mit der Shell arbeitet, wird leicht zum Programmierer: Schreiben Sie mehrere Shell-Befehle in eine Textdatei und machen diese ausführbar, haben Sie schon Ihr erstes Shell-Skript entwickelt. Die Shell bietet als Programmiersprache aber noch viel mehr.
  • Scripted Reality
    Aus den Shell-Tipps und dem Guru-Training kennen Sie viele nützliche Kommandozeilentools. Die können Sie in kleinen Shell-Skripten zu leistungsfähigen Miniprogrammen bündeln. Im einfachsten Fall lassen Sie damit mehrere Befehle automatisch nacheinander ablaufen, doch Skripte haben noch mehr zu bieten.
  • Missing Link
    Eine Sache, die Thunderbird traditionell schwer fällt, ist das automatische Öffnen von gesendeten Links in einem externen Browser. Wir zeigen, wie Firefox und Thunderbird kooperieren.
  • Erste Schritte mit Bash-Skripten
    Das Programmieren von Shell-Skripten ist keine Hexerei. Schon mit wenigen Grundkenntnissen sparen Sie durch das Automatisieren alltäglicher Aufgaben viel Zeit.
  • Alltagsaufgaben mit Skripten beschleunigen
    Ein Themenschwerpunkt Beschleunigung darf die Shell nicht auslassen, denn der Grundtenor unserer Guru-Training-Rubrik ist doch, dass Sie auf der Shell schneller als mit GUI-Tools arbeiten. Wir geben ein paar nützliche Beispiele.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Huawei
Pit Hampelmann, 13.12.2017 11:35, 2 Antworten
Welches Smartphone ist für euch momentan das beste? Sehe ja die Huawei gerade ganz weit vorne. Bi...
Fernstudium Informatik
Joe Cole, 12.12.2017 10:36, 2 Antworten
Hallo! habe früher als ich 13 Jahre angefangen mit HTML und später Java zu programmieren. Weit...
Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 3 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...