GNU/Linux >> Belajar Linux >  >> Linux

Skrip shell berfungsi dengan baik tanpa garis shebang? Mengapa?

Standar POSIX (Single UNIX Specification 4) tidak membantu:

Jika baris pertama file perintah shell dimulai dengan karakter "#!" , hasilnya tidak ditentukan.

Jadi, standar menyiratkan bahwa jika Anda tidak memiliki #! maka itu harus menjalankan shell POSIX. Tetapi cangkang modern tidak sesuai dengan POSIX. Korn Shell 88 (ksh88) yang lama menjalankan shell Bourne (dekat dengan shell POSIX) tanpa #! baris, tetapi ksh93 merusaknya, begitu pula Bash. Dengan ksh93 dan Bash, mereka menjalankan shell mereka sendiri jika tidak ada #! garis hadir.

Terlepas dari pendapat umum, cangkang Bash dan Korn berbeda. Ketika Anda menulis skrip shell, Anda tidak akan pernah bisa memastikan dari shell mana Anda akan dijalankan, atau bahkan jika itu akan dijalankan dari shell lain sama sekali (kebanyakan bahasa pemrograman dapat menjalankan program lain). Begitu Anda menggunakan sesuatu di luar sintaks Bourne/POSIX, Anda akan gagal.

Selalu gunakan #! baris, jangan biarkan itu terjadi secara kebetulan.


Shell induk, tempat Anda memasukkan ./myscript.sh , pertama mencoba execve itu, di mana garis shebang akan berlaku jika ada. Saat ini berhasil, induk tidak mengetahui perbedaan antara skrip dan ELF karena kernel yang menanganinya.

execve gagal, jadi fitur kompatibilitas unix kuno, yang mendahului keberadaan garis shebang, diaktifkan. Diduga bahwa file yang memiliki izin eksekusi tetapi tidak dikenali sebagai file yang dapat dieksekusi yang valid oleh kernel pasti berupa skrip shell.

Biasanya shell induk menebak bahwa skrip ditulis untuk shell yang sama (minimal shell mirip Bourne menjalankan skrip dengan /bin/sh , bash menjalankannya sebagai subproses bash), csh melakukan tebakan yang lebih rumit berdasarkan karakter pertama karena ia juga mendahului shebang dan perlu hidup berdampingan dengan Bourne shell).

Anda memerlukan garis shebang saat Anda tahu tebakan ini salah (misalnya dengan shebang adalah #!/usr/bin/perl ), atau saat Anda tidak memercayai tebakan untuk bekerja secara konsisten, atau saat skrip harus dapat dijalankan oleh proses induk yang bukan merupakan shell itu sendiri.


garis shebang diperlukan di file dan hanya jika dimaksudkan untuk dijalankan sebagai file yang dapat dieksekusi (berlawanan dengan sh file.sh doa. Ini sebenarnya tidak dibutuhkan oleh skrip, ini agar sistem mengetahui cara menemukan juru bahasa.

EDIT :Maaf karena salah membaca pertanyaan. Jika garis shebang hilang atau tidak dikenali, /bin/sh digunakan. Tapi saya lebih suka secara eksplisit tentang penerjemah.

Perhatikan, bahwa perilaku ini tidak universal, IIRC, hanya beberapa exec* fungsi keluarga melakukan itu (belum lagi platform yang berbeda), jadi itulah alasan lain untuk menjadi eksplisit di sini.


Linux
  1. Ubah direktori kerja di shell dengan skrip python

  2. Shell Script, baca di baris yang sama setelah mengulang pesan

  3. Bagaimana cara menghitung jumlah tab di setiap baris menggunakan skrip shell?

  1. Bagaimana cara menyisipkan baris baru di skrip shell Linux?

  2. Menghitung persentase pembulatan dalam Shell Script tanpa menggunakan bc

  3. Bunuh program setelah mengeluarkan baris tertentu, dari skrip shell

  1. Waktu Habis Dalam Skrip Shell?

  2. Direktori skrip Shell saat ini?

  3. shebang atau bukan shebang