Verschiedene Arten der Ausführung von Binärdateien und Skripten

11

Ich benutze Linux seit einiger Zeit und habe nach einer vollständigen Übersicht gesucht, aber keine gefunden.

Ich bin einfach nicht mit all den verschiedenen Arten der Ausführung von Skripten und Binärdateien einverstanden - es ist alles ein großes Durcheinander für mich und ich muss durch Ausprobieren bestimmen, was ich verwenden soll. Für eine Datei, die ein Skript oder eine Binärdatei ist <script/binary>, kann ich die folgenden Alternativen finden:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(Sind da mehr?)

Kann jemand einen vollständigen Überblick darüber geben, welche Befehle mit welchen Dateitypen funktionieren und was der Unterschied ist, wenn es mehrere Optionen gibt?

Vielen Dank.

Carl
quelle

Antworten:

7

Die folgenden Befehle sind identisch. Eine Punktkomponente bedeutet "aktuelles Verzeichnis". Um ausgeführt werden zu können, müssen die Dateien über ausführbare Berechtigungen verfügen:

path/to/binary
./path/to/binary

Beachten Sie, dass ein Pfad, der keinen Schrägstrich enthält, als Befehl behandelt wird (entweder eine integrierte Shell oder ein Programm, das in der $PATHUmgebungsvariablen nachgeschlagen wird).

Die folgenden sind fast gleich, sie führen ein Shell-Skript (keine Binärdatei!) In der aktuellen Shell-Umgebung aus. Ein kleiner Unterschied zwischen den beiden Zeilen wird in dieser Unix.SE-Frage beschrieben .

. path/to/script
source path/to/script

Schließlich haben Sie erwähnt sh script. Auch dies funktioniert nur für Shell-Skripte und nicht für Binärdateien. Sie führen das shProgramm grundsätzlich mit dem Skriptnamen als Argument aus. Im Fall von shwird dieses Argument nur als Shell-Skript behandelt und ausgeführt.

Antworten, die auf Shellskripte beschränkt sind, finden Sie unter Verschiedene Möglichkeiten zum Ausführen eines Shell-Skripts .

Lekensteyn
quelle
3

Vielen Dank für alle Beiträge. Ich werde jetzt versuchen, meine eigene Frage zu beantworten und eine vollständige Anleitung zu den verschiedenen Möglichkeiten zum Ausführen von Skripten und Binärdateien bereitzustellen. Bitte bearbeiten und kommentieren Sie und wir werden in der Lage sein, etwas zu finden, das vollständig und korrekt ist. Hier ist mein Vorschlag:

Zunächst zwei Punkte:

  • Linux unterscheidet zwischen einem Befehl und einem Pfad . Ein Befehl wird nur so wie er ist an der Eingabeaufforderung eingegeben und führt eine integrierte Funktion aus oder veranlasst Linux, im $ PATH nach einer entsprechenden Binärdatei oder einem Skript zu suchen.

  • Damit Linux etwas als Pfad interpretieren kann, muss es mindestens einen Schrägstrich (/) enthalten. ZB in ./myScript, ./kann ziemlich überflüssig erscheinen - es dient nur dazu, Linux als Pfad und nicht als Befehl zu interpretieren.

Also, die Optionen zum Ausführen einer Binärdatei oder eines Skripts:

Ausführen einer Binärdatei binary:

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

Ausführen eines Skripts script:

Sofern nicht anders angegeben, muss die Datei über Ausführungsberechtigungen verfügen.

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

Über Pony :

Skripte mit einem Knall (z. B. #!/bin/sh) in der ersten Zeile geben an, welcher Interpreter verwendet werden soll.

  • Dieser Interpreter wird verwendet, wenn er mit ./scriptoder unter Verwendung eines Befehls ausgeführt wird: script( scriptmuss sich auf dem Pfad befinden)
  • Mit sh scriptwird der Knall ignoriert und in diesem Fall shals Dolmetscher verwendet
  • Verwenden . scriptoder sourceignorieren Sie den She-Bang und verwenden Sie den aktuellen Interpreter (da .oder sourcegleichbedeutend damit ist, nur jede Zeile des Skripts in der aktuellen Shell auszuführen)

Fußnoten

* 1: Dies ist nur fast wahr. In bash sind sie in der Tat der gleiche Befehl, aber bei der Verwendung source, scriptwerden in $ PATH gesucht werden vor dem aktuellen Verzeichnis. Das ist Bash, aber in POSIX-only-Shells sourcefunktioniert es nicht, aber es .funktioniert. Verwenden Sie daher lieber Letzteres für die Portabilität.

* 2: Was tatsächlich passiert, ist, dass wir das binäre sh mit 'script' als Argument ausführen, wodurch 'sh' 'script' in seiner neuen Shell ausführt

Carl
quelle
2

Hier ist eine kurze Liste der Befehle. Wenn ich PATH erwähne, meine ich die Verzeichnisse, die Programme enthalten, die das System kennt. Sie finden die mit echo $PATH, und es wird so etwas wie:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Skripte

  • Verwenden Sie zum Ausführen eines Skripts im aktuellen Arbeitsverzeichnis ./myscript.sh
  • Um ein Skript für eine andere Datei auszuführen, verwenden Sie (wenn es sich im aktuellen Arbeitsverzeichnis befindet), ./myscript.sh textfile.txt
  • Skripte können auch mit Argumenten ausgeführt werden. wie in Rute (S. 68) erklärt: myfile.sh dogs cats birdsWird ausgegeben, The first argument is: dogs, second argument is: cats, third argument is: birdsweil der Inhalt dieses Skripts nach dem Shebang lautet:echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Verwenden Sie zum Ausführen eines Skripts in einem anderen Verzeichnis ~/Scripts/dogs.sh

  • Um ein Skript auszuführen, das dem System bekannt ist, weil es sich in Ihrem bin-Ordner in Ihrem Home-Verzeichnis befindet (erstellen Sie es einfach, wenn es nicht vorhanden ist, da es automatisch zu Ihrem PATH hinzugefügt wird), verwenden Sie einfach scriptname
  • Um ein von Ihnen installiertes Skript auszuführen, verwenden Sie einfach seinen Namen, da es dem System bekannt ist: Zum Beispiel: get_iplayer

Binärdateien

  • Verwenden Sie zum Ausführen einer Binärdatei, die dem System bekannt ist, weil sie sich in $ PATH befindet, den Namen des Programms und alle Parameter, z. vlc <stream url to open>
  • Verwenden Sie diese Option, um eine Binärdatei zu testen, die Sie vor der Installation in / usr / local / bin kompiliert haben, oder um ein eigenständiges Programm vom System fernzuhalten ~/<folder>/app/myprog

quelle
Danke für die Information. Ist diese Aussage richtig: Um ein Skript oder eine Binärdatei auszuführen, die nicht in PATH enthalten ist, gibt man einfach seinen Pfad an. Der Grund, warum ./ für ein Skript im aktuellen Pfad benötigt wird, ist, dass nur 'script.sh' als Befehl interpretiert wird, da mindestens ein Schrägstrich / fehlt.
Carl
"Um ein von Ihnen installiertes Skript auszuführen", was ist ein Skript, das ich "installiert" habe? Sagt dieser Punkt dasselbe wie der vorherige Punkt?
Carl
@ Carl- dein erster Kommentar ist richtig, aber es ist nicht wahr zu sagen, dass meine letzten beiden Punkte über Skripte gleich sind. In Punkt 5 des Skriptabschnitts habe ich über Skripte gesprochen, die der Benutzer manuell zu seinem bin-Ordner in seinem Ausgangsverzeichnis hinzugefügt hat. In Punkt 6 habe ich über Skripte wie get_iplayer gesprochen, die sie aus den Repositorys installiert haben und als solche immer in Systemordner und nicht in das Home-Verzeichnis des Benutzers gehen.
Entschuldigung, aber ich verstehe das immer noch nicht, ein Skript in ~ / bin / (das sich in PATH befindet) oder in einem Systemordner (das sich in PATH befindet) - wie kann es einen Unterschied zwischen ihnen geben? Verhalten sie sich anders?
Carl
Ich habe nur zwischen den Skripten unterschieden, die der Benutzer besitzt und in ~ / bin hinzufügt, und denen, die root in den Systemordnern gehören.