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.
strace -f -e fork,clone,execve
. Beberapa shell pergi ke eksekutif/bin/sh
setelah kegagalan; yang lain menafsirkan skrip itu sendiri.readlink /proc/$$/exe
.csh
dantcsh
, perilaku tergantung pada apakah skrip dimulai dengan#
(dalam hal ini mereka memanggil diri mereka sendiri daripada harus menafsirkan skrip). Itu kembali ke masa ketika csh mendukung komentar tetapi bukan shell Bourne, jadi#
itu petunjuk bahwa itu adalah skrip csh.1) Shell saat ini tempat Anda menjalankan. (Shell apa pun itu)
2) Tetap dengan jenis shell yang sama (bash / dash / ash / csh / apa pun selera Anda) dan pastikan "platform yang didukung" Anda menginstal shell yang ingin Anda gunakan secara default. Juga, cobalah untuk menggunakan perintah yang tersedia secara umum pada sistem. Hindari opsi spesifik mesin.
3) Sebenarnya tidak ada logika "jika-maka-lain" untuk
interpreter directive
. Anda harus menentukan shell yang harus ada pada semua sistem yang ingin Anda dukung ... yaitu#!/bin/bash
atau menentukan generik#!/bin/sh
selama skrip Anda cukup generik di semua shell.sumber