Di Unix, apa perbedaan antara skrip shell dan yang dapat dieksekusi?

Jawaban:

12

File yang dapat dieksekusi mengacu pada file apa pun dengan set bit yang dapat dieksekusi yang dapat dieksekusi (bahkan jika ada kesalahan dalam menjalankan program yang sebenarnya).

Script shell adalah tipe spesifik dari executable yang dimaksudkan untuk ditafsirkan oleh shell menggunakan #!arahan untuk menentukan penerjemah.

Chris Down
sumber
12

Sebuah naskah adalah file yang:

  • dapat dibaca manusia (setidaknya untuk manusia yang cukup terlatih, yaitu file terdiri dari karakter yang dapat dicetak); dan
  • dipahami oleh penerjemah sebagai instruksi yang menjelaskan perilaku suatu program.

Sebuah shell Script adalah script yang interpreter adalah shell . Dalam dunia unix, "shell" mengacu pada keluarga shell yang menyerupai shell Bourne ; shell modern seperti itu (abu, bash, ksh, zsh, ...) sesuai dengan standar shell POSIX . Secara umum, kata "shell" dapat menyertakan penafsir perintah lain seperti csh, tcsh, fish, ...


File yang dapat dieksekusi adalah file apa saja yang dapat dieksekusi. Agar dapat dieksekusi secara efektif, file harus memiliki dua properti:

  • Pengguna harus memiliki izin untuk menjalankannya. Ini dapat dilihat dengan perintah ls -l: xkarakter harus ada di kolom izin.
  • Format file harus salah satu yang diakui sistem dapat dieksekusi. Format yang dapat dieksekusi dapat dibagi menjadi beberapa kategori:

    • Executable asli, yang terdiri dari kode mesin yang diatur sesuai dengan tata letak yang dapat dieksekusi biner sistem operasi. Sebagian besar sistem unix modern menggunakan format ELF untuk executable asli mereka.
    • Skrip Skrip yang dapat dieksekusi adalah file yang diawali dengan garis shebang , terdiri dari dua karakter yang #!diikuti oleh jalur ke file. Untuk mengeksekusi file seperti itu, kernel mengeksekusi program interpreter dan meneruskannya ke script sebagai argumen.
    • Mungkin format lain tergantung pada sistem. Sebagai contoh, Linux dapat mendaftarkan format file sewenang-wenang melalui fasilitas binfmt_misc . Ini memungkinkan file bytecode Java dieksekusi melalui JVM terdaftar , executable Windows dieksekusi melalui Wine , dll.

Perhatikan bahwa menjadi executable tergantung pada sistem. Sebagai contoh, biner Linux amd64 dapat dieksekusi pada sistem Linux amd64 tetapi tidak pada sistem 32-bit. Biner untuk Android tidak dapat dijalankan pada instalasi Linux normal. Eksekusi Windows hanya dapat dieksekusi di Linux jika Wine ada. Skrip yang dimulai dengan #!/usr/local/bin/rubyhanya dapat dieksekusi jika ada program yang terletak di /usr/local/bin/ruby.


Script shell biasanya dapat dieksekusi. Tapi itu bisa tidak dapat dieksekusi, jika Anda tidak memiliki izin untuk menjalankannya. Anda masih dapat menafsirkannya dengan mengirimkannya secara eksplisit kepada penerjemah (mis. bash /path/to/script) - "minta ditafsirkan" adalah cara mewah untuk mengatakan "eksekusi".

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

skrip shell:

Script shell adalah serangkaian perintah yang akan ditafsirkan oleh shell (Biasanya sh atau shell yang kompatibel dengan sh, kadang-kadang yang lain.)

Nama skrip dapat, tetapi TIDAK perlu, diakhiri dengan ".sh" atau ".bash" atau ".csh" dll (memberikan petunjuk tentang shell yang seharusnya diluncurkan oleh).

Untuk kejelasan saya akan berasumsi: bahwa nama skripnya script, dan shell itu harus diluncurkan adalah bash.

Cara khas untuk meluncurkannya dalam shell adalah: bash /absolute/path/to/the/scriptatau bash ./relative/path/to/the/script. Dengan begitu, tidak perlu memiliki bit yang dapat dieksekusi, karena hanya dibaca oleh bash, yang kemudian mengeksekusi konten.

Hal dapat juga diatur + x (executable) untuk memungkinkan untuk memulai itu langsung dari sesi shell Anda saat ini dengan: / absolute / path / ke / dalam / script (atau ./relative/path/to/the/script). Hati-hati: secara default, ketika diluncurkan dengan cara itu, diluncurkan melalui shell yang Anda ketikkan atau melalui shell posix (perilaku bergantung pada OS), jadi itu mungkin bukan shell yang seharusnya dijalankan. Itu sebabnya Anda dapat (dan harus) menentukan sebagai baris pertama skrip: #! / Path / to / good / shell yang menunjukkan ke OS Anda bahwa skrip tersebut harus benar-benar diluncurkan oleh / path / to / good / shell sebagai gantinya.

dieksekusi:

File executable adalah file yang memiliki bit "x" yang ditetapkan untuk pengguna / grup yang seharusnya diluncurkan oleh. Ini bisa berupa "biner", atau skrip.

Kiat: file /some/filedapat memberi tahu Anda lebih lanjut tentang konten file. Coba file /usr/bin/bashatau file /etc/profilelihat beberapa contoh.

Olivier Dulac
sumber
Pernyataan Anda tentang skrip shebangless yang dijalankan oleh shell Anda saat ini salah. Perilaku ini tergantung pada OS. Secara umum, shell POSIX atau shell login Anda digunakan.
jlliagre
Terima kasih atas ketepatan ini. Saya akan mengedit jawaban saya untuk menambahkan komentar Anda.
Olivier Dulac