Bash Script Toestemming geweigerd & Slechte Interpreter

Ik ben op een 64-bits kali linux.

Ik heb een python-script gemaakt dat 2 argumenten nodig heeft om te starten. Ik wil niet elke keer exact dezelfde paden typen of zoeken in de geschiedenis van de commandos die ik in terminal heb gebruikt. Dus besloot ik om een eenvoudig script te maken dat het python-script met zijn argumenten aanroept.

#! /bin bash python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/ 

Het is exact hetzelfde commando dat ik zou gebruiken in terminal. Ik krijg echter een foutmelding wanneer ik het scriptbestand probeer uit te voeren.

bash: ./wtf.sh: /bin: bad interpreter: Permission denied 

wtf.sh heeft uitvoerbare rechten.

Wat is er mis?

Antwoord

Je hebt hier een spatie in plaats van een schuine streep:

 #! /bin bash  

Moet zijn:

 #! /bin/bash  

of gewoon

 #!/bin/bash  

(de eerste spatie is optioneel). De shebang (#!) moet worden gevolgd door het pad naar een uitvoerbaar bestand , dat kan worden gevolgd door één argument , bijv.

 #!/usr/bin/env sh  

In dit geval /usr/bin/env is het uitvoerbare bestand; zie man env voor details.

Alleen /bin verwijst naar een directory.

Opmerkingen

  • verdomme, gekke ik! Bedankt! Heb ' dat niet gezien …
  • Misschien wil je er een gewoonte van maken om #!/bin/sh (in plaats daarvan van #!/bin/bash) tenzij je weet dat je bash functies gebruikt.
  • @ G-Man Bedankt voor het opschonen van dit een beetje hoger. WRT bash vs. sh, ik volgde net het patroon van de vraag (hoewel ik de neiging heb om alleen sh te gebruiken als ik weet dat ik ' m niet met bash-functies).
  • In Ubuntu-terminal is which bash nuttig. Dat geeft /bin/bash terug. Bovenaan mijn Bash-script voeg ik #!/bin/bash toe. Als ik vervolgens het Bash-script wil uitvoeren, voer ik bash foo.sh in. Dus which sh wordt op dezelfde manier gebruikt. sh foo.sh
  • @ G-Man, in de wereld van alledag zijn er een ongelukkig aantal mensen die ' t weten of ze Bash-functies gebruiken of niet. In veel gevallen heeft het ' de voorkeur dat een script helemaal niet draait (omdat Bash is gespecificeerd in de shebang maar ontbreekt) in plaats van uit te voeren en te doen iets onverwachts (omdat /bin/sh iets anders is dan Bash en er ongemerkte Bashisms in het script zijn). Zie hier.

Antwoord

Het is vermeldenswaard dat als het mountpoint waarop uw script zich bevindt het “noexec” -attribuut heeft, u alles kunt kiezen wat u wilt en het zal nog steeds niet werken, maar het aanroepen van de interpreter met het script als argument zal dat wel doen (zolang die op zijn beurt niet proberen een ander script op een noexec-mount uit te voeren).

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *