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
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).
#!/bin/sh
(místo toho z#!/bin/bash
), pokud nevíte, že používátebash
funkce.sh
pouze když vím, že jsem ' m nepoužívá funkce bash).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ámbash foo.sh
.which sh
se tedy používá stejným způsobem.sh foo.sh
/bin/sh
je něco jiného než Bash a ve skriptu jsou nepozorované Bashismy). Viz zde.