Jika saya ingin menjalankan skrip bash yang tidak memiliki set izin eksekusi, saya dapat melakukan:
bash script.sh
Apa yang harus saya gunakan alih-alih bash
jika skrip tidak dapat dieksekusi dan saya tidak tahu penerjemah yang benar? Apakah ada perintah yang mencari penerjemah dari baris shebang dan menjalankan skrip dengannya?
bash whatever
berhasil, mengapa menggunakan sesuatu yang berbeda? bash tersedia di hampir setiap sistem * ix, jadi mengapa repot-repot ...Jawaban:
Ya. Ini disebut
perl
:Ini disebutkan dalam dokumentasi Perl :
sumber
.js
juga berfungsi?#!
. Saya sudah tampak beberapa lebih sekarang, dan belum mengalami masalah ini.man perlrun
malu-malu mengakui bahwa itu "sedikit aneh" :). Saya pikir ini harus diperlakukan sebagai rasa ingin tahu yang ditujukan pada lingkungan non-UNIX dan versi UNIX yang sangat lama.Naskah tidak harus memiliki shebang
Jika skrip dijalankan dari interpreter, Anda tidak dapat memastikan ia memiliki shebang sama sekali . Script, jalankan dari interpreter tidak perlu shebang , jika Anda memanggil interpreter untuk menjalankan kode.
Karena itu jawabannya adalah tidak, tidak ada perintah yang akan mencari tahu dengan pasti apa bahasa (penerjemah) untuk menjalankan skrip. Namun Anda selalu dapat melihat ke dalam skrip dan melihat apakah ada shebang untuk mengetahuinya.
Singkatnya aturan:
Jika skrip tidak memiliki shebang, tidak ada informasi (langsung *) di dalam skrip untuk memberi tahu penerjemah apa yang akan digunakan.
Setelah mengatakan itu
Anda tentu saja selalu dapat menulis skrip pembungkus untuk mencoba mencari tahu apakah skrip tersebut memiliki shebang dan membaca interpreter dari itu, kemudian menjalankannya dari interpreter yang ditemukan.
Sebuah contoh
Simpan sebagai
tryrun
di$PATH
(misalnya~/bin
, membuat direktori jika tidak ada, log out dan kembali), membuatnya dieksekusi . Kemudian jalankan:panggilan (diuji) penerjemah yang benar pada skrip yang tidak dapat dieksekusi
python
dan sayabash
.Penjelasan
#!
dan menggunakan sisanya untuk memanggil penerjemah.PermissionError
atau aFileNotFoundError
.Catatan
Ekstensi (
.sh
,.py
dll) tidak memainkan peran apa pun dalam menentukan penerjemah yang tepat di Linux.(* Tentu saja memungkinkan untuk mengembangkan algoritma tebak "pintar" untuk menentukan sintaks dari kode.)
sumber
Anda dapat mencapai ini dengan skrip seperti ini:
Jadi:
Saya merekomendasikan untuk tidak melakukan ini. Izin ada karena suatu alasan. Ini adalah program untuk menumbangkan izin.
Perhatikan bahwa penanganan shebang adalah fungsi kernel (dalam kode sumber Linux -
fs/binfmt_script.c
). Pada dasarnya proses yang memanggil skrip secara langsung tidak tahu#!
- kernel menggunakannya untuk mengetahui bahwa ia perlu meluncurkan juru bahasa.sumber