Tillatelse fra Bash Script nektet & Dårlig tolk

Jeg er på en kali linux 64 bit.

Jeg har laget et python-skript som tar to argumenter å starte. Jeg vil ikke skrive ut hver gang nøyaktig de samme stiene eller søke i historien til kommandoene jeg brukte i terminalen. Så jeg bestemte meg for å lage et enkelt skript som kaller python-skriptet med argumentene.

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

Det er nøyaktig den samme kommandoen jeg vil bruke i terminalen. Jeg får imidlertid en feilmelding når jeg prøver å kjøre skriptfilen.

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

wtf.sh har kjørbare rettigheter.

Hva er galt?

Svar

Du har et mellomrom i stedet for en skråstrek her:

 #! /bin bash  

Bør være:

 #! /bin/bash  

eller bare

 #!/bin/bash  

(den første plassen er valgfri). Shebang (#!) skal følges av banen til en kjørbar , som kan følges av ett argument , f.eks.

 #!/usr/bin/env sh  

I dette tilfellet /usr/bin/env er kjørbar; se man env for detaljer.

Bare /bin refererer til en katalog.

Kommentarer

  • jævla, dumme meg! Takk! Viste ikke ' det …
  • Det kan være lurt å bruke #!/bin/sh (i stedet av #!/bin/bash) med mindre du vet at du bruker bash -funksjoner.
  • @ G-Man Takk for at du har rengjort dette litt opp. WRT bash vs sh, jeg fulgte bare mønsteret fra spørsmålet (selv om min tendens er å bare bruke sh når jeg vet at jeg ' m ikke ved hjelp av bash-funksjoner).
  • I Ubuntu-terminalen er which bash nyttig. Det returnerer /bin/bash. Øverst i Bash-skriptet mitt legger jeg til #!/bin/bash. Så når jeg vil kjøre Bash-skriptet, skriver jeg inn bash foo.sh. Så which sh brukes på samme måte. sh foo.sh
  • @ G-Man, i arbeidsdagen er det et uheldig antall mennesker som ikke ' t vet om de bruker Bash-funksjoner eller ikke. I mange tilfeller er det ' å foretrekke å ha et skript ikke kjøre i det hele tatt (fordi Bash er spesifisert i shebang men mangler) i stedet for å kjøre og gjøre noe uventet (fordi /bin/sh er noe annet enn Bash, og det er ubemerkede basisme i skriptet). Se her.

Svar

Det er verdt å merke seg at hvis monteringspunktet som skriptet ditt ligger på har «noexec» -attributtet, kan du shebang alt du vil, og det vil fortsatt ikke fungere, men å påkalle tolk med skriptet som argument vil (så lenge som i sin tur ikke prøver å kjøre et nytt skript på en noexec-montering).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *