Bash Script-Berechtigung verweigert & Bad Interpreter

8

Ich bin auf einem Kali Linux 64 Bit.

Ich habe ein Python-Skript erstellt, das zum Starten zwei Argumente benötigt. 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 hat ausführbare Rechte.

Was ist falsch?

Davlog
quelle

Antworten:

10

Sie haben hier 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, dem ein Argument folgen kann , z.

#!/usr/bin/env sh

In diesem Fall /usr/bin/envist die ausführbare Datei; siehe man envfür Details.

Gerade /binbezieht sich auf ein Verzeichnis.

Goldlöckchen
quelle
verdammt, dumm mich! Vielen Dank!
Hab das
1
Möglicherweise möchten Sie sich daran gewöhnen, #!/bin/sh(anstelle von #!/bin/bash) Funktionen zu verwenden, es sei denn, Sie wissen, dass Sie bashFunktionen verwenden.
G-Man sagt "Reinstate Monica"
@ G-Man Danke, dass du das ein bisschen aufgeräumt hast. WRT bash vs. sh, ich habe nur das Muster aus der Frage befolgt (obwohl meine Tendenz darin besteht, nur zu verwenden, shwenn ich weiß, dass ich keine Bash-Funktionen verwende).
Goldlöckchen
Im Ubuntu-Terminal which bashist hilfreich. Das kehrt zurück /bin/bash. Oben in meinem Bash-Skript füge ich hinzu #!/bin/bash. Wenn ich dann das Bash-Skript ausführen möchte, gebe ich ein bash foo.sh. Wird which shalso genauso verwendet. sh foo.sh
Noobninja
1
@ G-Man, in der Arbeitswelt gibt es eine unglückliche Anzahl von Menschen, die nicht wissen, ob sie Bash-Funktionen verwenden oder nicht. In vielen Fällen ist es vorzuziehen, dass ein Skript überhaupt nicht ausgeführt wird (weil Bash im Shebang angegeben ist, aber fehlt), anstatt etwas Unerwartetes auszuführen (weil /bin/shes etwas anderes als Bash ist und das Skript unbemerkte Bashisms enthält). Siehe hier.
Wildcard
1

Es ist erwähnenswert, dass, wenn der Mountpunkt, auf dem sich Ihr Skript befindet, das Attribut 'noexec' hat, Sie alles, was Sie wollen, anzeigen können 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).

Splud
quelle