Permisiunea scriptului Bash a fost refuzată & Interpret necorespunzător

I „m pe un kali linux pe 64 de biți.

Am creat un script python care necesită 2 argumente pentru a începe. Nu vreau să scriu exact de fiecare dată aceleași căi sau să caut în istoricul comenzilor pe care le-am folosit în terminal. Așa că am decis să creez un script simplu care numește scriptul python cu argumentele sale.

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

Este exact aceeași comandă pe care aș folosi-o în terminal. Cu toate acestea, primesc un mesaj de eroare când încerc să execut fișierul script.

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

wtf.sh are drepturi executabile.

Ce este în neregulă?

Răspuns

Aici aveți un spațiu în loc de o bară înainte:

 #! /bin bash  

Ar trebui să fie:

 #! /bin/bash  

sau pur și simplu

 #!/bin/bash  

(primul spațiu este opțional). Shebang (#!) ar trebui să fie urmat de calea către un executabil , care poate fi urmat de un argument , de exemplu,

 #!/usr/bin/env sh  

În acest caz /usr/bin/env este executabil; consultați man env pentru detalii.

Doar /bin se referă la un director.

Comentarii

  • la naiba, prostește-mă! Mulțumiri! ' nu am văzut că …
  • S-ar putea să doriți să vă obișnuiți cu utilizarea #!/bin/sh din #!/bin/bash), cu excepția cazului în care știți că utilizați funcții bash.
  • @ G-Man Vă mulțumim că ați curățat acest lucru un pic sus. WRT bash vs. sh, tocmai urmam modelul din întrebare (deși tendința mea este să folosesc sh doar când știu că ' Nu nu folosesc funcții bash).
  • În terminalul Ubuntu, which bash este util. Aceasta returnează /bin/bash. În partea de sus a scriptului meu Bash adaug #!/bin/bash. Apoi, când vreau să rulez scriptul Bash, introduc bash foo.sh. Deci, which sh este utilizat în același mod. sh foo.sh
  • @ G-Man, în lumea lucrătoare există un număr nefericit de oameni care nu ' știu dacă folosesc sau nu funcțiile Bash. În multe cazuri, ' este de preferat ca un script să nu ruleze deloc (deoarece Bash este specificat în shebang, dar lipsește), mai degrabă decât să ruleze și să facă ceva neașteptat (deoarece /bin/sh este altceva decât Bash și există bashisme neobservate în script). Vedeți aici.

Răspuns

Este demn de remarcat faptul că, dacă punctul de montare pe care se află scriptul dvs. are atributul „noexec”, atunci puteți să aruncați tot ce doriți și tot nu va funcționa, dar invocând interpretul cu scriptul ca argument va (atâta timp cât care la rândul său nu încearcă să ruleze un alt script pe o montare noexec).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *