Was ist unter Unix der Unterschied zwischen einem Shell-Skript und einer ausführbaren Datei?

Antworten:

12

Eine ausführbare Datei bezieht sich auf jede Datei mit dem gesetzten ausführbaren Bit, die ausgeführt werden könnte (selbst wenn beim tatsächlichen Ausführen des Programms Fehler auftreten).

Ein Shell-Skript ist ein bestimmter Typ einer ausführbaren Datei, die von einer Shell interpretiert werden soll, indem die #!Anweisung zum Angeben eines Interpreters verwendet wird.

Chris Down
quelle
12

Ein Skript ist eine Datei, die:

  • ist für Menschen lesbar (zumindest für einen einigermaßen geschulten Menschen, dh die Datei besteht aus druckbaren Zeichen); und
  • wird von einem Interpreter als Anweisung verstanden, die das Verhalten eines Programms beschreibt.

Ein Shell-Skript ist ein Skript, dessen Interpreter eine Shell ist . In der Unix-Welt bezieht sich „Shell“ auf die Familie der Shells, die der Bourne-Shell ähneln . Moderne solche Shells (Asche, Bash, Ksh, Zsh,…) entsprechen dem POSIX- Shell-Standard. Allgemeiner kann das Wort "Shell" andere Befehlsinterpreter wie csh, tcsh, fish, ... enthalten.


Eine ausführbare Datei ist eine beliebige Datei, die ausgeführt werden kann. Um effektiv ausführbar zu sein, muss eine Datei zwei Eigenschaften haben:

  • Der Benutzer muss die Berechtigung haben, es auszuführen. Dies kann mit dem Befehl gesehen werden ls -l: Das xZeichen muss in der Berechtigungsspalte vorhanden sein.
  • Das Format der Datei muss vom System als ausführbar erkannt werden. Ausführbare Formate können in mehrere Kategorien unterteilt werden:

    • Native ausführbare Dateien, die aus Maschinencode bestehen, der gemäß dem binären ausführbaren Layout des Betriebssystems organisiert ist. Die meisten modernen Unix-Systeme verwenden das ELF- Format für ihre nativen ausführbaren Dateien.
    • Skripte. Ein ausführbares Skript ist eine Datei, die mit einer Shebang- Zeile beginnt , die aus zwei Zeichen #!gefolgt von einem Pfad zu einer Datei besteht. Um eine solche Datei auszuführen, führt der Kernel das Interpreterprogramm aus und übergibt ihm den Pfad zum Skript als Argument.
    • Möglicherweise andere Formate je nach System. Beispielsweise kann Linux beliebige Dateiformate über die Funktion binfmt_misc registrieren . Auf diese Weise können Java-Bytecodedateien über eine registrierte JVM , ausführbare Windows-Dateien über Wine usw. ausgeführt werden.

Beachten Sie, dass die Ausführung einer ausführbaren Datei vom System abhängt. Beispielsweise kann eine amd64 Linux-Binärdatei auf einem amd64 Linux-System ausgeführt werden, nicht jedoch auf einem 32-Bit-System. Eine Binärdatei für Android kann bei einer normalen Linux-Installation nicht ausgeführt werden. Eine ausführbare Windows-Datei kann nur unter Linux ausgeführt werden, wenn Wine vorhanden ist. Ein Skript, das mit beginnt, kann #!/usr/local/bin/rubynur ausgeführt werden, wenn sich ein Programm unter befindet /usr/local/bin/ruby.


Ein Shell-Skript ist normalerweise ausführbar. Es kann jedoch nicht ausführbar sein, wenn Sie nicht über die Berechtigung zum Ausführen verfügen. Sie können es trotzdem interpretieren lassen, indem Sie es explizit an den Interpreter weitergeben (z. B. bash /path/to/script) - "interpretieren lassen" ist eine ausgefallene Art, "ausführen" zu sagen.

Gilles 'SO - hör auf böse zu sein'
quelle
2

Shell-Skript:

Ein Shell-Skript ist eine Reihe von Befehlen, die von einer Shell interpretiert werden (normalerweise sh oder eine sh-kompatible Shell, manchmal eine andere).

Der Skriptname kann, muss aber NICHT mit ".sh" oder ".bash" oder ".csh" usw. enden (mit einem Hinweis auf die Shell, von der er gestartet werden soll).

Aus Gründen der Klarheit gehe ich davon aus, dass der Skriptname lautet scriptund die Shell, in der er gestartet werden soll, lautet bash.

Ein typischer Weg, um es in der Shell zu starten, wäre dann: bash /absolute/path/to/the/scriptoder bash ./relative/path/to/the/script. Auf diese Weise muss das ausführbare Bit nicht gesetzt sein, da es nur von bash gelesen wird, das dann den Inhalt ausführt.

Es kann auch + x (ausführbar) gesetzt werden, damit es direkt von Ihrer aktuellen Shell-Sitzung aus gestartet werden kann mit: / absolute / path / to / the / script (oder ./relative/path/to/the/script). Achtung: Wenn es auf diese Weise gestartet wird, wird es standardmäßig über die von Ihnen eingegebene Shell oder über eine Posix-Shell gestartet (das Verhalten ist vom Betriebssystem abhängig), sodass es möglicherweise nicht die Shell sein kann, von der es ausgeführt werden soll. Aus diesem Grund können (und sollten) Sie als erste Zeile des Skripts Folgendes angeben: #! / Path / to / good / shell, das Ihrem Betriebssystem angibt, dass dieses Skript tatsächlich von / path / to / good / shell gestartet werden sollte.

ausführbar:

Eine ausführbare Datei ist eine Datei, in der das Bit "x" für die Benutzer / Gruppen gesetzt ist, von denen sie gestartet werden soll. Dies kann normalerweise eine "Binärdatei" oder ein Skript sein.

Tipp: Hier file /some/fileerfahren Sie mehr über den Inhalt der Datei. Versuchen Sie file /usr/bin/bashoder file /etc/profilesehen Sie einige Beispiele.

Olivier Dulac
quelle
Ihre Aussage, dass Shebangless-Skripte von Ihrer aktuellen Shell ausgeführt werden, ist falsch. Das Verhalten ist vom Betriebssystem abhängig. Im Allgemeinen wird entweder eine POSIX-Shell oder Ihre Login-Shell verwendet.
11.
Vielen Dank für diese Präzision. Ich werde meine Antwort bearbeiten, um Ihren Kommentar hinzuzufügen.
Olivier Dulac