Odmítnuto oprávnění Bash Script & Špatný tlumočník

Jsem 64bitový kali linux.

Vytvořil jsem skript v Pythonu, který má ke spuštění 2 argumenty. Nechci vypisovat pokaždé přesně stejné cesty ani hledat v historii příkazů, které jsem použil v terminálu. Takže jsem se rozhodl vytvořit jednoduchý skript, který volá skript pythonu s jeho argumenty.

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

Je to přesně stejný příkaz, jaký bych použil v terminálu. Při pokusu o spuštění souboru skriptu se mi však zobrazí chybová zpráva.

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

wtf.sh má spustitelná práva.

Co se děje?

Odpověď

Zde máte místo lomítka mezeru:

 #! /bin bash  

Mělo by být:

 #! /bin/bash  

nebo jednoduše

 #!/bin/bash  

(první mezera je volitelná). Za shebangem (#!) by měla následovat cesta ke spustitelnému souboru , za kterou může následovat jeden argument , např.

 #!/usr/bin/env sh  

V tomto případě /usr/bin/env je spustitelný soubor; podrobnosti viz man env.

Pouze /bin odkazuje na adresář.

Komentáře

  • sakra, hloupě mě! Dík! Neviděli jste ' že …
  • Možná si budete chtít zvyknout používat #!/bin/sh (místo toho z #!/bin/bash), pokud nevíte, že používáte bash funkce.
  • @ G-Man Děkujeme za vyčištění trochu nahoru. WRT bash vs. sh, sledoval jsem pouze vzor z otázky (i když mám tendenci používat sh pouze když vím, že jsem ' m nepoužívá funkce bash).
  • V terminálu Ubuntu je užitečné which bash. Tím se vrátí /bin/bash. Na začátek svého skriptu Bash přidám #!/bin/bash. Když pak chci spustit skript Bash, zadám bash foo.sh. which sh se tedy používá stejným způsobem. sh foo.sh
  • @ G-Man, v pracovním světě je nešťastné množství lidí, kteří ' t vědět zda používají funkce Bash nebo ne. V mnoha případech je ' vhodnější mít skript vůbec nespuštěn (protože Bash je uveden v shebangu, ale chybí), spíše než běžet a dělat něco neočekávaného (protože /bin/sh je něco jiného než Bash a ve skriptu jsou nepozorované Bashismy). Viz zde.

Odpověď

Stojí za zmínku, že pokud přípojný bod, na kterém je váš skript umístěn, má atribut „noexec“, můžete Shebang vše, co chcete, a stále to nebude fungovat, ale vyvolání tlumočníka pomocí skriptu jako argumentu bude (pokud že se zase nepokouší spustit jiný skript na noexec mount).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *