Jenis jalan apa di shebang yang lebih disukai?

20

Dalam skrip, baris pertama harus menentukan path ke interpreter.
Tetapi pada server yang berbeda Linux, Unix, atau BSD jalur ini bisa berbeda.

Apa yang lebih disukai?

#!/usr/bin/env bash 

atau

#!/bin/bash 
Roman Ivanov
sumber

Jawaban:

22

Jika Anda ingin menggunakan versi juru bahasa yang diinstal sistem yang dipasang di lokasi standar, gunakan jalur langsung. Jika Anda ingin menggunakan versi penerjemah apa pun yang muncul pertama kali di pengguna $PATH, gunakan #!/usr/bin/env ....

The envperintah memanggil perintah tertentu, membiarkan Anda mengatur atau variabel lingkungan unset:

env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &

Jika Anda tidak menentukan variabel lingkungan apa pun atau opsi lain, itu hanya akan memunculkan perintah bernama. (Menggunakannya dengan cara ini bisa dibilang sedikit hack.)

Tujuan penulisan shebang sebagai

#!/usr/bin/env interp

adalah untuk memohon apa pun yang interpmuncul pertama kali di $PATH.

Ini berarti Anda tidak harus tahu, saat menulis script, persis di mana interpadalah (katakanlah, jika bisa baik /bin, /usr/binatau /usr/local/bin). Tentu saja Anda harus tahu bahwa envini /usr/bin/env, tapi itu tampaknya cukup universal.

Keuntungannya adalah ia memanggil versi penerjemah mana pun yang muncul pertama kali pada pengguna $PATH. The Kerugian adalah bahwa hal itu memanggil mana versi penafsir muncul pertama kali di pengguna $PATH.

Sebagai contoh, misalkan saya telah menginstal membangun pribadi di perlbawah direktori home saya, seperti $HOME/bin/perl, dan saya miliki $HOME/bindi depan saya $PATH. Jika saya menjalankan skrip yang shebang-nya

#!/usr/bin/env perl

maka itu akan dijalankan dengan perlexecutable terinstal saya sendiri - yang mungkin bukan hal yang baik. Penulis skrip mungkin belum mengujinya dengan Perl-edge Bleading yang saya buat dari sumber sebulan yang lalu.

Untuk sesuatu seperti Perl atau Bash yang mungkin dipasang di lokasi yang konsisten pada sebagian besar sistem ( /usr/bin/perldan /bin/bash, masing-masing), saya akan menggunakan jalur langsung ke perintah. Untuk sesuatu yang lebih tidak jelas yang dapat diinstal secara berbeda pada sistem yang berbeda, saya akan menggunakan /usr/bin/envtriknya, atau saya akan menulis installer yang menyesuaikan garis shebang ketika script sedang diinstal. (Dulu saya harus melakukan itu untuk skrip Perl saya.)

UPDATE: Saya telah masuk ke sedikit lebih detail dalam jawaban untuk pertanyaan ini di situs Unix & Linux .

Keith Thompson
sumber
Saya baru saja mulai mencari di Ruby, dan saya menemukan bahwa konvensi di Ruby adalah untuk memulai dengan [code] #! / Usr / bin / env ruby ​​[/ code] demi portabilitas. Beberapa mencatat bahwa ini menyulitkan untuk memasok argumen baris perintah ke interpreter ruby, seperti '-w', yang juga akan menjadi masalah bagi Perl.
bgvaughan
@ bgvaughan Untuk Perl, ini tradisional saat ini hanya untuk digunakan #!/usr/bin/perldan kemudian digunakan use strict; use warnings;dalam tubuh skrip, bukan #!/usr/bin/perl -w. Tetapi -Tharus di shebang.
Keith Thompson
jadi mengapa tidak menggunakan #! perl jika kita hanya ingin yang pertama di jalan?
Diingatdibandingkandari
@wheredidthatnamecomefrom: Karena itu tidak berhasil. Perawatan #!garis tidak digunakan $PATH. Anda harus menentukan jalur penerjemah. (Saya baru menyadari bahwa, setidaknya pada sistem saya, ini bisa menjadi jalur relatif, tapi itu jarang berguna.)
Keith Thompson
6

Praktik terbaik adalah ini:

#!/usr/bin/env bash 
#!/usr/bin/env sh
#!/usr/bin/env python

Dan seterusnya...

Ketika Ubuntu pertama kali mulai menggunakan tanda hubung, beberapa skrip rusak. Ada diskusi tentang itu. Sebagian besar skrip ditulis #!/bin/shyang merupakan tautan ke / bin / bash. Konsensusnya adalah ini: penulis naskah bertanggung jawab untuk menentukan penerjemah. Karenanya, jika skrip Anda harus selalu dipanggil dengan BASH, tentukan dari lingkungan. Ini menghemat Anda harus menebak jalannya, yang berbeda pada berbagai sistem Unix / Linux. Selain itu, ini akan berfungsi jika besok / bin / sh menjadi tautan ke beberapa shell lain seperti / bin / wthsh atau beberapa omong kosong lainnya.


sumber
Perbaikan alternatif yang jelas untuk masalah tanda hubung adalah menulis #!/bin/bash. Saya setuju bahwa penulis skrip bertanggung jawab untuk menentukan penerjemah, tetapi semua itu artinya adalah jika Anda memerlukan bash, katakanlah bash bukan sh
Martin Bonner mendukung Monica
1

FYI itu shee-bang #!, kamu butuh #. Anda menggunakan baris ini untuk mengidentifikasi juru bahasa untuk menjalankan skrip.

Secara default, tautan Ubuntu /bin/shke dash

Tergantung pada seberapa banyak Anda mungkin ingin tahu tentang dasbor dan mengapa dasbor digunakan untuk cangkang sistem atau deamon, lihat:

dasbor cyberciti.biz

Ubuntu manual man page

Bash adalah shell default yang digunakan oleh sebagian besar pengguna Linux, dan memiliki berbagai fitur kemudian dash. Sebuah skrip yang ditulis untuk bash mungkin atau tidak dapat berjalan dengan baik jika dijalankan dengan tanda hubung, semakin kompleks skrip tersebut, semakin kecil kemungkinan skrip tersebut dijalankan.

Script yang ditulis untuk perl, python, dll. Tidak akan berjalan sama sekali dengan /bin/shatau /bin/bash.

Jadi, ketika Anda menulis skrip, Anda mengidentifikasi penerjemah apa yang harus digunakan dengan shee-bang

Pemilihan apa yang akan digunakan dibuat oleh penulis skrip, dan satu tidak lebih baik dari yang lain, mereka semua memiliki berbagai fitur, kelebihan, dan kekurangan.

Harimau kumbang
sumber