Saya baru mengenal shell script dan banyak buku telah menulis yang menggunakan baris #! (Sha-bang) di awal skrip untuk memanggil penerjemah. Dan ini akan memanggil shell baru untuk skrip dan melakukan interpretasi baris demi baris. Tetapi satu naskah dasar saya masih berjalan tanpa garis ajaib.
jadi pertanyaan saya adalah:
- dari mana naskah dasar saya mendapatkan penerjemah.
- bagaimana script berhasil menemukan juru bahasa.
sekarang izinkan saya memberi tahu Anda tentang skrip dasar saya hanya berisi baris berikut:
gema "naskah dasar tanpa garis ajaib"
bash
shell-script
pengguna1678213
sumber
sumber
Jawaban:
Jika garis ajaib tidak disediakan, shell default digunakan untuk menjalankan skrip. Shell default ini bisa berupa shell Bourne (sh) yang merupakan kasus dalam beberapa rasa, namun, dalam beberapa rasa lain, shell default yang digunakan sama dengan shell login untuk menjalankannya. Masalahnya adalah: Jangan serahkan pada sistem untuk memutuskan shell, selalu berikan shell yang Anda inginkan di baris pertama.
sumber
/bin/sh
, hanya untuk menjadish
executable pertama yang ditemukan saat menjelajahi PATH yang sesuai.Ketika Anda menjalankan suatu program, kernel memeriksa apakah itu dimulai dengan beberapa urutan byte ajaib . Jika file yang dapat dieksekusi dimulai dengan
#!
, kernel menafsirkan sisa baris sebagai nama juru bahasa. Jika file yang dapat dijalankan dimulai dengan\177ELF
(di mana\177
byte 127), itu memuat file sebagai executable ELF ; itulah jenis normal pada kebanyakan sistem unix saat ini.Jika kernel tidak mengenali format file, ia menolak untuk mengeksekusi file dan mengembalikan kesalahan ENOEXEC (Exec format error). Ketika shell memperhatikan hal itu, dibutuhkan sendiri untuk menjalankan program sebagai skrip shell.
Untuk menyaksikan ini dalam tindakan, tambahkan beberapa perintah ke skrip Anda:
(Ini untuk Linux, sesuaikan untuk unix lain.) Kemudian coba jalankan skrip itu dari berbagai shell. Anda akan melihat bahwa beberapa shell memunculkan instance baru untuk mengeksekusi skrip (bash, ksh93) sementara yang lain menelurkan
/bin/sh
(dash, pdksh, zsh).sumber
ls -l
perintah Anda ? Ini:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? Jika demikian, apa isinya? Juga, melihat saya punyaSHELL=/bin/bash
padaenv
, tapi perubahan itu tampaknya tidak perubahan perilaku. Mungkin itu tidak berhubungan?ls -l /proc/$$/exe
, sebenarnya). Theexe
link poin ke shell yang mengeksekusi naskah Anda. Saat Anda menjalankan skrip, Anda akan melihat bahwa itu bash yang menafsirkan skrip. Jika Anda menjalankannya dari pdksh misalnya, itu berjalan/bin/sh
. Saya tidak tahu ada shell yang menggunakanSHELL
variabel lingkungan atau shell login dalam keadaan itu./etc/passwd
mengubah shell apa yang dieksekusi ketika Anda login melalui SSH atau pada konsol teks. Itu tidak mengubah shell yang mungkin menjalankan skrip./etc/passwd
untuk memutuskan shell mana yang akan digunakan, mereka mengambil forked dari instance mereka sendiri atau dieksekusi/bin/sh
.Itu mungkin salah satu dari 3 kemungkinan berikut:
Anda memanggil skrip secara langsung dengan penerjemah, IE: bash script.sh
Nama file skrip memiliki ekstensi .sh, yang membuat sistem mencari program default untuk jenis file ini
Lingkungan shell yang Anda gunakan menjalankan 'gema' dengan sendirinya, karena saya hanya bisa menebak bahwa file skrip dapat dieksekusi. Jika, misalnya, Anda akan menggunakan bash shell dan memiliki perintah di file Anda yang hanya digunakan oleh ksh, maka Anda akan melihat bahwa itu tidak akan berfungsi.
Semoga berhasil!
sumber