Apakah ada Bash
shebang yang secara obyektif lebih baik daripada yang lain untuk sebagian besar kegunaan?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- dll
Saya samar-samar ingat beberapa waktu yang lalu mendengar bahwa menambahkan tanda hubung pada akhirnya mencegah seseorang mengirimkan perintah ke skrip Anda, tetapi tidak dapat menemukan detail tentang itu.
/usr/local/bin/bash
di OpenBSD.Jawaban:
Anda harus menggunakan
#!/usr/bin/env bash
untuk portabilitas : berbeda * nixes menempatkanbash
di tempat yang berbeda, dan menggunakan/usr/bin/env
adalah solusi untuk menjalankan pertamabash
ditemukan padaPATH
. Dansh
tidakbash
.sumber
/bin/sh
, dll).bash
tidak tinggal di/bin
semua sistem.alias shebang='echo "#!/usr/bin/env bash"'
sekarang saya hanya perlu membuka terminal dan mengetik shebang daripada pergi ke sini.env
di/usr/bin/env
. Bisa saja di/bin/env
atau di mana saja pada kenyataannya, selama itu ada di jalan. Bisa jadi/dummy/env
kalau/dummy
ada diPATH
. Shebang sendiri tidak terdefinisi di bawah POSIX, jadi saya bisa#!stop toaster
memulai mesin kopi USB dan menjadi POSIX. Jadi#!/usr/bin/env bash
tidak terlalu baik daripada#!/bin/bash
itu, bisa jadi lebih portabel tergantung./usr/bin/env
ada lebih banyak mesin daripada/bin/bash
xor/usr/bin/bash
, jadi skrip yang dimulai dengan baris ini akan melakukan hal yang diharapkan pada sebanyak mungkin mesin./bin/sh
biasanya merupakan tautan ke shell default sistem, yang seringbash
tetapi aktif, misalnya, sistem Debian lebih ringandash
. Either way, shell Bourne asli adalahsh
, jadi jika skrip Anda menggunakan beberapabash
(generasi ke-2, "Bourne Again sh") fitur tertentu ([[ ]]
tes, array, berbagai hal manis, dll.), Maka Anda harus lebih spesifik dan menggunakan nanti . Dengan cara ini, pada sistem di mana bash tidak diinstal, skrip Anda tidak akan berjalan. Saya mengerti mungkin ada trilogi film yang mengasyikkan tentang evolusi ini ... tapi itu bisa jadi kabar angin.Juga perhatikan bahwa ketika dipicu sebagai
sh
,bash
sampai batas tertentu berperilaku sebagai standar POSIXsh
(lihat juga dokumentasi GNU tentang ini).sumber
/bin/sh
ke mana pun/usr
karena hal itu akan membuat skrip init sulit dijalankan sebelum/usr
dipasang./bin
dan/sbin
selama bertahun-tahun baru saja symlink secara default, ke/usr/bin
dan/usr/sbin
, jadi dalam konteks itu/bin/sh
adalah tautan kebash
dan yang sebenarnya direktori adalah/usr/bin
. Tapi saya akan memperbaiki di atas.Saya sarankan menggunakan:
Ini bukan 100% portabel (beberapa sistem menempatkan
bash
di lokasi selain/bin
), tetapi kenyataan bahwa banyak skrip yang ada menggunakan#!/bin/bash
tekanan berbagai sistem operasi untuk membuat/bin/bash
setidaknya symlink ke lokasi utama.Alternatif dari:
telah disarankan - tetapi tidak ada jaminan bahwa
env
perintah ada di/usr/bin
(dan saya telah menggunakan sistem di mana tidak) Selain itu, formulir ini akan menggunakan contoh pertamabash
di pengguna saat ini$PATH
, yang mungkin bukan versi yang sesuai dari bash shell.(Tetapi
/usr/bin/env
harus bekerja pada sistem modern yang masuk akal, baik karenaenv
di dalam/usr/bin
atau karena sistem melakukan sesuatu untuk membuatnya bekerja. Sistem yang saya sebutkan di atas adalah SunOS 4, yang mungkin belum saya gunakan dalam sekitar 25 tahun.)Jika Anda memerlukan skrip untuk dijalankan pada sistem yang tidak memiliki
/bin/bash
skrip, Anda dapat memodifikasi skrip untuk menunjuk ke lokasi yang benar (itu memang tidak nyaman).Saya telah membahas pengorbanan secara lebih mendalam dalam jawaban saya untuk pertanyaan ini .
Pembaruan yang agak kabur: Satu sistem yang saya gunakan, Termux , lapisan desktop-Linux-like yang berjalan di bawah Android, tidak memiliki
/bin/bash
(bash
tetapi/data/data/com.termux/files/usr/bin/bash
) - tetapi ia memiliki penanganan khusus untuk didukung#!/bin/bash
.sumber
Menggunakan garis shebang untuk memohon penerjemah yang tepat bukan hanya untuk BASH. Anda dapat menggunakan shebang untuk bahasa yang ditafsirkan pada sistem Anda seperti Perl, Python, PHP (CLI) dan banyak lainnya. Ngomong-ngomong, shebang
(bisa juga dua tanda hubung, yaitu
--
) mengakhiri opsi bash semuanya setelah akan diperlakukan sebagai nama file dan argumen.Menggunakan
env
perintah membuat skrip Anda portabel dan memungkinkan Anda untuk mengatur lingkungan khusus untuk skrip Anda sehingga skrip portabel harus digunakanAtau untuk bahasa apa pun seperti untuk Perl
Pastikan untuk melihat
man
halaman untukbash
:dan
env
:Catatan: Pada sistem berbasis Debian dan berbasis Debian, seperti Ubuntu,
sh
ditautkan kedash
tidakbash
. Karena semua skrip sistem digunakansh
. Ini memungkinkan bash untuk tumbuh dan sistem tetap stabil, menurut Debian.Juga, untuk menjaga doa * nix seperti saya tidak pernah menggunakan ekstensi file pada skrip yang dipanggil shebang, karena Anda tidak bisa menghilangkan ekstensi pada permintaan pada executable seperti yang Anda bisa pada Windows. Perintah file dapat mengidentifikasi itu sebagai skrip.
sumber
Ini benar-benar tergantung pada bagaimana Anda menulis skrip bash Anda. Jika Anda
/bin/sh
terhubung ke bash, saat bash dipanggil sebagaish
, beberapa fitur tidak tersedia .Jika Anda ingin fitur khusus bash, non-POSIX, gunakan
#!/bin/bash
sumber
pkg_add
, maka terletak di/usr/local/bin
, yang mungkin tidak di jalur.POSIX
fitur?