HOWTO zum Aufruf von Shell-Skripten

(C) 2006-2017 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
              OSTC Open Source Training and Consulting GmbH
              www.ostc.de

$Id: shell-call-HOWTO.txt,v 1.14 2019/11/26 19:37:07 tsbirn Exp $

Dieses Dokument beschreibt die verschiedenen Verfahren zum Aufruf von
Shell-Skripten.

Inhaltsverzeichnis

1) Aufrufarten

1) Aufrufarten   (Toc)

FÌr den Aufruf eines Shell-Skriptes gibt es folgende Möglichkeiten, je nach
Anwendungszweck ist eine geeignete auszuwÀhlen:

  +-----------------+------+-------+-----+------+---+---+-------+--------+
  |                 |"PATH"| "x"-  |     |      |Env|Sh |Aliase+|RÃŒckkehr|
  |   A u f r u f   |durch-| Recht |Sub- |Neuer |Var|Var|Funkt. |zum     |
  |                 |sucht | nötig |Shell|Proz. |vererbt|vererbt|Aufrufer|
  +-----------------+------+-------+-----+------+---+---+-------+--------+
  | cmd.sh          |  Ja  |  Ja   | Ja  |  Ja  | J | - |  --   |   Ja   |
  | ./cmd.sh        |  --  |  Ja   | Ja  |  Ja  | J | - |  --   |   Ja   |
  | /PFAD/ZU/cmd.sh |  --  |  Ja   | Ja  |  Ja  | J | - |  --   |   Ja   |
  | sh [OPT] cmd.sh |  --  |  --   | Ja  |  Ja  | J | - |  --   |   Ja   |
  +-----------------+------+-------+-----+------+---+---+-------+--------+
  | . cmd.sh        |  Ja  |  --   | --  |  --  | J | J |  Ja   |   Ja   |
  | source cmd.sh   |  Ja  |  --   | --  |  --  | J | J |  Ja   |   Ja   |
  | . ./cmd.sh      |  --  |  --   | --  |  --  | J | J |  Ja   |   Ja   |
  | source ./cmd.sh |  --  |  --   | --  |  --  | J | J |  Ja   |   Ja   |
  +-----------------+------+-------+-----+------+---+---+-------+--------+
  | exec cmd.sh     |  Ja  |  Ja   | --  |  --  | J | - |  --   |   --   |
  | exec ./cmd.sh   |  --  |  Ja   | --  |  --  | J | - |  --   |   --   |
  +-----------------+------+-------+-----+------+---+---+-------+--------+

* Das Kommando "." heißt auch "source"- oder "dot"-Kommando. Es liest die
  angegebene Datei in der aktuellen Shell ein (eine Art include-Anweisung),
  startet also KEINE Sub-Shell. Der Suchpfad wird dabei wie bei einem normalen
  Kommando-Aufruf durchsucht.

* Der Name von Shell-Skripten ist beliebig wÀhlbar. Per Konvention wird aber
  meist die Extension ".sh" angehÀngt (die dann beim auch Aufruf anzugeben ist!).

* Shell-Skripte mÃŒssen immer das Lese-Recht ("r"-Bit) gesetzt haben. Sofern
  sie als Kommando (ohne "sh", ".", "source", "exec" davor) aufgerufen werden
  sollen, mÃŒssen sie auch ausfÃŒhrbar sein ("x"-Bit) und in einem Verzeichnis
  im Suchpfad $PATH liegen.

* Der Suchpfad $PATH wird immer dann durchsucht, wenn nur ein Kommandoname
  angegeben wurde. Da inzwischen bei allen Benutzern (insbesondere der
  "root"!) aus SicherheitsgrÃŒnden das aktuelle Verzeichnis "." im Pfad fehlt,
  muss man Skripten im aktuellen Verzeichnis immer per "./SKRIPT" aufrufen.

* Von den Shell-Variablen werden nur die EXPORTIERTEN "Umgebungs-Variablen"
  an das aufgerufene Skript vererbt (Befehl "export"). "Shell-Variablen"
  sowie Aliase und Funktionen werden NICHT an Shell-Skripte vererbt.

* Wird eine Sub-Shell gestartet (Standardfall), dann können Variablen und
  sonstige Einstellungen aus dem gestarteten Skript NICHT an das aufrufende
  Skript zurÃŒckgegeben werden (die alten Werte in der Ausgangs-Shell bleiben
  erhalten). Dies wirkt auf den ersten Blick widersinning, ist allerdings
  unter dem Aspekt der UnabhÀngigkeit von Skripten ein gutes Konzept.

* Das Standardverhalten von DOS/Windows, alle Skripten im gleichen Umgebungs-
  bereich auszufÃŒhren, hat dort zu vielen Problemen gefÃŒhrt (SpeicherÃŒberlauf,
  Variablen ÃŒberschrieben, Variablen unabsichtlich gesetzt, ...)

* Ein Aufruf ÃŒber "exec" spart einen Prozeß ein, eine RÃŒckkehr zum aufrufenden
  Prozeß ist allerdings nicht mehr möglich. Ist dann sinnvoll, wenn sehr viele
  Prozesse gestartet werden oder wenn der aufgerufenen Befehl der letzte im
  Skript ist.

* Shell-Skripte sollten kein SUID- oder SGID-Bit gesetzt haben, da sie immer das
  Lese-Recht gesetzt haben mÌssen und daher evtl. vorhandene Sicherheitslöcher
  sehr einfach durch Lesen des Skriptes zu entdecken sind.

* Unter LINUX sind aus diesem Grund beide Bits fÃŒr Shell-Skripten nicht setzbar.
  Bei jeder Änderung an ausfÃŒhrbaren Dateien werden zudem diese beiden Bits aus
  SicherheitsgrÃŒnden zurÃŒckgesetzt und mÃŒssen explizit wieder gesetzt werden.