Izin Bash Script ditolak & Penerjemah Buruk

8

Saya menggunakan kali linux 64 bit.

Saya telah membuat skrip python yang membutuhkan 2 argumen untuk memulai. Saya tidak ingin mengetik setiap kali jalur yang sama persis atau mencari dalam sejarah perintah yang saya gunakan di terminal. Jadi saya memutuskan untuk membuat skrip sederhana yang memanggil skrip python dengan argumennya.

#! /bin bash

python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/

Ini adalah perintah yang sama persis yang akan saya gunakan di terminal. Namun, saya mendapatkan pesan kesalahan saat mencoba menjalankan file skrip.

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

wtf.sh memiliki hak yang dapat dieksekusi.

Apa yang salah?

Davlog
sumber

Jawaban:

10

Anda memiliki spasi alih-alih garis miring di sini:

#! /bin bash

Seharusnya:

#! /bin/bash

atau sederhana

#!/bin/bash

(ruang pertama adalah opsional). Shebang ( #!) harus diikuti oleh path ke executable , yang dapat diikuti oleh satu argumen , misalnya,

#!/usr/bin/env sh

Dalam hal ini /usr/bin/envadalah executable; lihat man envdetailnya.

Hanya /binmerujuk ke direktori.

goldilocks
sumber
sial, konyol aku! Terima kasih! Tidak melihat itu ...
Davlog
1
Anda mungkin ingin membiasakan diri menggunakan #!/bin/sh(alih-alih #!/bin/bash) kecuali Anda tahu bahwa Anda menggunakan bashfitur.
G-Man Mengatakan 'Reinstate Monica'
@ G-Man Terima kasih telah membersihkan ini sedikit. WRT bash vs. sh, saya baru saja mengikuti pola dari pertanyaan (meskipun kecenderungan saya hanya menggunakan shketika saya tahu saya tidak menggunakan fitur bash).
goldilocks
Di terminal Ubuntu, which bashsangat membantu. Itu kembali /bin/bash. Di bagian atas skrip Bash saya, saya menambahkan #!/bin/bash. Lalu ketika saya ingin menjalankan skrip Bash, saya masuk bash foo.sh. Begitu which shjuga digunakan dengan cara yang sama. sh foo.sh
noobninja
1
@ G-Man, di dunia biasa ada banyak orang yang tidak tahu apakah mereka menggunakan fitur Bash atau tidak. Dalam banyak kasus lebih disukai memiliki skrip tidak berjalan sama sekali (karena Bash ditentukan dalam shebang tetapi hilang) daripada menjalankan dan melakukan sesuatu yang tidak terduga (karena /bin/shadalah sesuatu selain Bash dan ada Bashisme yang tidak diketahui dalam skrip). Lihat disini.
Wildcard
1

Perlu dicatat bahwa jika mountpoint di mana skrip Anda berada memiliki atribut 'noexec', maka Anda dapat mengubah semua yang Anda inginkan dan itu masih tidak akan berhasil, tetapi memanggil penerjemah dengan skrip sebagai argumen akan (selama yang pada gilirannya tidak mencoba menjalankan skrip lain di mount noexec).

Bercak
sumber