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
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
Jawaban:
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 env
perintah 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 interp
muncul pertama kali di $PATH
.
Ini berarti Anda tidak harus tahu, saat menulis script, persis di mana interp
adalah (katakanlah, jika bisa baik /bin
, /usr/bin
atau /usr/local/bin
). Tentu saja Anda harus tahu bahwa env
ini /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 perl
bawah direktori home saya, seperti $HOME/bin/perl
, dan saya miliki $HOME/bin
di depan saya $PATH
. Jika saya menjalankan skrip yang shebang-nya
#!/usr/bin/env perl
maka itu akan dijalankan dengan perl
executable 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/perl
dan /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/env
triknya, 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 .
#!/usr/bin/perl
dan kemudian digunakan use strict; use warnings;
dalam tubuh skrip, bukan #!/usr/bin/perl -w
. Tetapi -T
harus di shebang.
#!
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.)
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/sh
yang 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.
#!/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
FYI itu shee-bang #!
, kamu butuh #
. Anda menggunakan baris ini untuk mengidentifikasi juru bahasa untuk menjalankan skrip.
Secara default, tautan Ubuntu /bin/sh
ke dash
Tergantung pada seberapa banyak Anda mungkin ingin tahu tentang dasbor dan mengapa dasbor digunakan untuk cangkang sistem atau deamon, lihat:
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/sh
atau /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.