Ich bin auf einem 64-Bit-Kali-Linux.
Ich habe ein Python-Skript erstellt, für dessen Start zwei Argumente erforderlich sind. Ich möchte nicht jedes Mal genau dieselben Pfade oder Suchvorgänge im Verlauf der Befehle eingeben, die ich im Terminal verwendet habe. Also habe ich beschlossen, ein einfaches Skript zu erstellen, das das Python-Skript mit seinen Argumenten aufruft.
#! /bin bash python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/
Es ist genau der gleiche Befehl, den ich im Terminal verwenden würde. Beim Versuch, die Skriptdatei auszuführen, wird jedoch eine Fehlermeldung angezeigt.
bash: ./wtf.sh: /bin: bad interpreter: Permission denied
wtf.sh verfügt über ausführbare Rechte.
Was ist los?
Antwort
Hier haben Sie ein Leerzeichen anstelle eines Schrägstrichs:
#! /bin bash
Sollte sein:
#! /bin/bash
oder einfach
#!/bin/bash
(das erste Leerzeichen ist optional). Dem Shebang (#!
) sollte der Pfad zu einer ausführbaren Datei folgen, gefolgt von ein Argument , z. B.
#!/usr/bin/env sh
In diesem Fall /usr/bin/env
ist die ausführbare Datei; Weitere Informationen finden Sie unter man env
.
Nur /bin
bezieht sich auf ein Verzeichnis.
Kommentare
- Verdammt, dumm mich! Vielen Dank! ' hat das nicht gesehen …
- Vielleicht möchten Sie sich angewöhnen, stattdessen
#!/bin/sh
zu verwenden von#!/bin/bash
), es sei denn, Sie wissen, dass Siebash
-Funktionen verwenden. - @ G-Man Vielen Dank für die Bereinigung ein bisschen nach oben. WRT bash vs. sh, ich folgte nur dem Muster aus der Frage (obwohl meine Tendenz darin besteht,
sh
nur zu verwenden, wenn ich weiß, dass ich ' m verwendet keine Bash-Funktionen). - Im Ubuntu-Terminal ist
which bash
hilfreich. Das gibt/bin/bash
zurück. Am Anfang meines Bash-Skripts füge ich#!/bin/bash
hinzu. Wenn ich dann das Bash-Skript ausführen möchte, gebe ichbash foo.sh
ein.which sh
wird also auf die gleiche Weise verwendet.sh foo.sh
- @ G-Man, in der Arbeitswelt gibt es eine unglückliche Anzahl von Menschen, die nicht ' t wissen , ob sie Bash-Funktionen verwenden oder nicht. In vielen Fällen ist es ' vorzuziehen, dass ein Skript überhaupt nicht ausgeführt wird (da Bash im Shebang angegeben ist, aber fehlt), anstatt ausgeführt und ausgeführt zu werden etwas Unerwartetes (weil
/bin/sh
etwas anderes als Bash ist und das Skript unbemerkte Bashismen enthält). Siehe hier.
Antwort
Es ist erwähnenswert, dass, wenn der Mountpunkt, auf dem sich Ihr Skript befindet, das Attribut „noexec“ hat, Sie alles zeigen können, was Sie wollen, und es immer noch nicht funktioniert, aber den Interpreter mit dem Skript als Argument aufrufen wird (solange das wiederum versucht nicht, ein anderes Skript auf einem Noexec-Mount auszuführen.