Korzystam z 64-bitowego systemu Kali Linux.
Stworzyłem skrypt w Pythonie, który zaczyna się od 2 argumentów.Nie chcę wpisywać za każdym razem dokładnie tych samych ścieżek ani przeszukiwać historii poleceń, których użyłem w terminalu. Postanowiłem więc stworzyć prosty skrypt, który wywołuje skrypt w języku Python wraz z jego argumentami.
#! /bin bash python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/
Jest to dokładnie to samo polecenie, którego użyłbym w terminalu. Jednak pojawia się komunikat o błędzie, gdy próbuję uruchomić plik skryptu.
bash: ./wtf.sh: /bin: bad interpreter: Permission denied
wtf.sh ma prawa do wykonywania.
Co się stało?
Odpowiedź
Masz tutaj spację zamiast ukośnika:
#! /bin bash
Powinien być:
#! /bin/bash
lub po prostu
#!/bin/bash
(pierwsza spacja jest opcjonalna). Po shebang (#!
) powinna następować ścieżka do pliku wykonywalnego , po której może następować jeden argument , np.
#!/usr/bin/env sh
W tym przypadku /usr/bin/env
to plik wykonywalny; zobacz man env
, aby uzyskać szczegółowe informacje.
Po prostu /bin
odnosi się do katalogu.
Komentarze
Odpowiedź
Warto zauważyć, że jeśli punkt montowania, w którym znajduje się twój skrypt, ma atrybut „noexec”, możesz wbić wszystko, co chcesz, a to nadal nie zadziała, ale wywołanie interpretera ze skryptem jako argumentem będzie (o ile to z kolei nie próbuje uruchomić innego skryptu na montowaniu noexec).
#!/bin/sh
(zamiast z#!/bin/bash
), chyba że wiesz, że używasz funkcjibash
.sh
tylko wtedy, gdy wiem, że ' m nie przy użyciu funkcji basha).which bash
. To zwraca/bin/bash
. U góry mojego skryptu Bash dodaję#!/bin/bash
. Następnie, gdy chcę uruchomić skrypt Bash, wpisujębash foo.sh
. Dlategowhich sh
jest używane w ten sam sposób.sh foo.sh
/bin/sh
to coś innego niż Bash, aw skrypcie są niezauważone Bashizmy). Zobacz tutaj.