Saya telah melihat di sejumlah tempat, termasuk rekomendasi di situs ini ( Apa yang disukai Bash shebang? ), Untuk digunakan #!/usr/bin/env bash
sebagai preferensi #!/bin/bash
. Saya bahkan telah melihat satu individu yang giat menyarankan penggunaan #!/bin/bash
yang salah dan fungsi bash akan hilang dengan melakukannya.
Semua yang dikatakan, saya menggunakan bash dalam lingkungan pengujian yang dikontrol ketat di mana setiap drive yang beredar pada dasarnya adalah tiruan dari master drive tunggal. Saya memahami argumen portabilitas, meskipun tidak selalu berlaku dalam kasus saya. Apakah ada alasan lain untuk memilih #!/usr/bin/env bash
daripada alternatif dan, dengan asumsi portabilitas menjadi perhatian, apakah ada alasan menggunakannya dapat merusak fungsi?
env
mungkin tidak ditemukan di/usr/bin
. Komentar Shebang sama sekali ide yang buruk IMHO. Jika penerjemah skrip default Anda tidak menangani komentar shebang, itu hanya komentar. Namun, jika Anda tahu juru bahasa skrip dapat menangani komentar shebang, dan Anda tahu jalan menuju bash, tidak ada alasan untuk tidak memintanya menggunakan jalur absolutnya kecuali jika jalurnya terlalu panjang (tidak mungkin), atau Anda mungkin dapat port script ke sistem yang tidak memiliki bash yang terletak di / bin. Kemudian lagi, peringatan yang saya sebutkan sebelumnya berlaku dalam kasus itu karena melibatkan portabilitas./etc
atau/bin/sh
.bash
adalah add-on untuk sebagian besar sistem seperti Unix. Ini hanya Linux di manabash
dijamin berada/bin
dan kemungkinan besar juga terhubung sebagai/bin/sh
. Sejak Linux menjadi Unix de facto modern bagi banyak orang, fakta bahwa sistem selain Linux mungkin ada telah dilupakan. Dalam jawaban saya sendiri di bawah ini saya menganggap Linux karena Anda berkatabash
. Banyak kotak BSD yang telah saya kerjakan bahkan belum diinstal./bin/bash
. Bash tidak diinstal secara default. Jika Anda menginginkannya, Anda harus melakukannyapkg install bash
. Setelah diinstal itu terletak di/usr/local/bin/bash
. Tidak ada yang diinstal di/bin/bash
OpenBSD. Kerinduan#!/bin/bash
kehendak kesalahan, dan#!/usr/bin/env bash
akan berhasil.Jawaban:
#!/usr/bin/env
pencarianPATH
untukbash
, danbash
tidak selalu di/bin
, terutama pada sistem non-Linux. Sebagai contoh, pada sistem OpenBSD saya, ia masuk/usr/local/bin
, karena diinstal sebagai paket opsional.Jika Anda benar-benar yakin
bash
ada/bin
dan akan selalu ada, tidak ada salahnya untuk meletakkannya langsung di jendela Anda — tetapi saya akan merekomendasikannya karena skrip dan program semua memiliki kehidupan di luar apa yang awalnya kami yakini akan mereka miliki.sumber
env
lokasi? POSIX tidak memaksanya./usr/lib/sendmail
(atau, baru-baru ini,/usr/sbin/sendmail
) biner tersedia untuk memproses surat, itu merupakan kepentingan terbaik sistem Unix untuk dimiliki/usr/bin/env
karena env shebang adalah praktik umum yang demikian. Ini adalah antarmuka standar de facto.env
, tetapi entah bagaimana tidak memiliki lokasi standar (yang hanya bisa menjadi tautan lunak) untukbash
. Belum lagi, mengapa hashbang tidak menerima adil#!bash
, dan menggunakanPATH
, bukannya kita melakukan hal yang persis sama dengannyaenv
. Kurasa tidak cukup membingungkan untuk pemula.This mostly works because the path /usr/bin/env is commonly used for the env utility
sini en.wikipedia.org/wiki/Shebang_(Unix) - Kita harus curhatenv
berada di sana "mungkin" di semua sistem.env
berada/bin
, tidak dalam/usr/bin
(tidak yakin yang mana, kemungkinan SunOS 4). Hari-hari ini sangat mungkin/usr/bin/env
akan tersedia, hanya karena popularitas#!/usr/bin/env
peretasan.Lokasi standar bash adalah
/bin
, dan saya menduga itu benar pada semua sistem. Namun, bagaimana jika Anda tidak menyukai versi bash itu? Misalnya, saya ingin menggunakan bash 4.2, tetapi bash di Mac saya ada di 3.2.5.Aku bisa mencoba menginstal ulang pesta di
/bin
tapi itu mungkin ide yang buruk. Jika saya memperbarui OS saya, itu akan ditimpa.Namun, saya dapat menginstal bash in
/usr/local/bin/bash
, dan mengatur PATH saya untuk:Sekarang, jika saya tentukan
bash
, saya tidak mendapatkan yang lama kasar/bin/bash
, tapi yang lebih baru, lebih bersinar di/usr/local/bin
. Bagus!Kecuali skrip shell saya punya
!# /bin/bash
shebang itu. Jadi, ketika saya menjalankan skrip shell saya, saya mendapatkan versi bash yang lama dan buruk yang bahkan tidak memiliki array asosiatif.Menggunakan
/usr/bin/env bash
akan menggunakan versi bash yang ditemukan di PATH saya. Jika saya mengatur PATH saya, sehingga/usr/local/bin/bash
dieksekusi, itu adalah bash yang akan digunakan skrip saya.Jarang melihat ini dengan bash, tetapi jauh lebih umum dengan Perl dan Python:
/bin
?/usr/bin
?/opt/bin
? Siapa tahu? Menggunakan#! /usr/bin/env perl
berarti saya tidak perlu tahu.Dan Sekarang Mengapa Anda Tidak Harus Menggunakan
#! /usr/bin/env bash
Ketika jalurnya di-hardcode di shebang, saya harus menjalankannya dengan penerjemah itu. Jadi,
#! /bin/bash
memaksa saya untuk menggunakan versi default bash yang diinstal. Karena fitur bash sangat stabil (coba jalankan versi 2.x skrip Python di bawah Python 3.x), sangat tidak mungkin skrip BASH khusus saya tidak akan berfungsi, dan karena skrip bash saya mungkin digunakan oleh sistem ini dan sistem lain , menggunakan versi bash non-standar mungkin memiliki efek yang tidak diinginkan. Sangat mungkin saya ingin memastikan bahwa versi standar stabil bash digunakan dengan skrip shell saya. Jadi, saya mungkin ingin mengkodekan jalur di shebang saya.sumber
Untuk memohon
bash
itu sedikit berlebihan. Kecuali Anda memiliki banyakbash
binari seperti di ~ / bin Anda tetapi itu juga berarti kode Anda bergantung pada $ PATH yang memiliki hal-hal yang benar di dalamnya.Ini berguna untuk hal-hal seperti itu
python
. Ada skrip dan lingkungan pembungkus yang mengarah kepython
binari alternatif yang digunakan.Tapi tidak ada yang hilang dengan menggunakan path yang tepat ke biner selama Anda yakin itu adalah biner yang Anda inginkan.
sumber
python
. Saya telah kehilangan hitungan jumlah tempat yangpython
dapat ditemukan 😀/usr/bin/env
lebih berguna untuk Python, terutama jika Anda menggunakan virtualenv.Ada banyak sistem yang tidak memiliki Bash
/bin
, FreeBSD dan OpenBSD hanya untuk beberapa nama. Jika skrip Anda dimaksudkan untuk dibawa-bawa ke banyak Unices yang berbeda, Anda mungkin ingin menggunakannya#!/usr/bin/env bash
sebagai gantinya#!/bin/bash
.Perhatikan bahwa ini tidak berlaku untuk
sh
; untuk script Bourne-compliant saya secara eksklusif menggunakan#!/bin/sh
, karena saya pikir cukup banyak setiap Unix yang ada memilikish
di/bin
.sumber
/bin
dir, saya mengertish -> dash
. Tertaut secara simbolis dengandash
, mengungkapkan sifat Debian Ubuntu. Jalankan ketiga string perintah ini untuk menyadari semuanya bermuara pada preferensi individu:which bash
laluwhich sh
laluwhich dash
.Saya lebih suka membungkus program utama dalam skrip seperti di bawah ini untuk memeriksa semua yang
bash
tersedia di sistem. Lebih baik memiliki lebih banyak kontrol pada versi yang digunakannya.sumber
jelas lebih baik karena ia menemukan bash executable path dari variabel lingkungan sistem Anda.
Buka Linux shell Anda dan ketik
Ini akan mencetak semua variabel lingkungan Anda.
Buka skrip dan ketik shell Anda
Ini akan mencetak bash path Anda (sesuai dengan daftar variabel lingkungan) yang harus Anda gunakan untuk membangun jalur shebang yang benar dalam skrip Anda.
sumber