Shell mana yang menjalankan skrip ketika tidak ada baris shebang (#! / Path / ke / shell) di awal? Saya berasumsi / bin / sh tapi saya tidak bisa mengkonfirmasi.
Kernel menolak untuk mengeksekusi skrip dan kembali seperti ENOEXEC, sehingga perilaku yang tepat tergantung pada program Anda menjalankan script tersebut dari .
- bash 4.2.39 - menggunakan dirinya sendiri
- busybox-ash 1.20.2 - menggunakan dirinya sendiri
- dash 0.5.7 - menjalankan / bin / sh
- fish 1.23.1 - mengeluh tentang ENOEXEC, lalu menyalahkan file yang salah
- AT&T ksh 93u + 2012.08.01 - menggunakan dirinya sendiri
- mksh R40f - menjalankan / bin / sh
- pdksh 5.2.14 - menjalankan / bin / sh
- sh-heirloom 050706 - menggunakan sendiri
- tcsh 6.18.01 - menjalankan / bin / sh
- zsh 5.0.0 - menjalankan / bin / sh
- cmd.exe 5.1.2600 - melihat Anda lucu.
Dalam glibc , berfungsi execv()
atau execve()
kembali saja ENOEXEC. Tetapi execvp()
menyembunyikan kode kesalahan ini dan secara otomatis memanggil / bin / sh. (Ini didokumentasikan dalam exec (3p) .)
Apa yang dianggap "praktik terbaik" dalam hal menulis skrip shell yang akan berjalan pada platform apa pun? (ok, ini semacam open-ended)
Baik tetap berpegang pada sh
dan hanya fitur-fitur yang didefinisikan POSIX, atau cukup gunakan bash penuh (yang tersedia secara luas) dan sebutkan dalam persyaratan Anda jika mendistribusikannya.
(Sekarang saya memikirkannya, Perl - atau mungkin Python - akan menjadi lebih portabel, belum lagi memiliki sintaks yang lebih baik.)
Selalu tambahkan baris shebang. Jika menggunakan bash atau zsh, gunakan #!/usr/bin/env bash
sebagai ganti hardcoding lintasan shell. (Namun, shell POSIX dijamin berada di /bin/sh
, jadi lewati env
kasus itu.)
(Sayangnya, bahkan /bin/sh
tidak selalu sama. Program autoconf GNU harus berurusan dengan banyak quirks yang berbeda .)
Apakah mungkin untuk menulis skrip yang mencoba menggunakan zsh dan kembali ke bash jika zsh tidak tersedia? Saya sudah mencoba meletakkan dua baris shebang, seperti di bawah ini, tetapi hanya kesalahan dengan juru bahasa yang buruk: / bin / zsh: tidak ada file atau direktori seperti itu jika saya mencobanya pada mesin tanpa zsh.
Hanya ada satu garis shebang; semuanya setelah karakter baris baru bahkan tidak dibaca oleh kernel, dan diperlakukan sebagai komentar oleh shell.
Ini mungkin untuk menulis naskah yang berjalan sebagai #!/bin/sh
, cek yang shell tersedia, dan berjalan exec zsh "$0" "$@"
atau exec bash "$0" "$@"
tergantung pada hasil. Namun, sintaks yang digunakan oleh bash dan zsh sangat berbeda di berbagai tempat sehingga saya tidak akan merekomendasikan melakukan ini untuk kewarasan Anda sendiri.