GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Lebih Baik Menggunakan "#!/usr/bin/env Name" Daripada "#!/path/to/name" Sebagai Shebang?

Saya perhatikan bahwa beberapa skrip yang saya peroleh dari orang lain memiliki #!/path/to/NAME Shebang sementara yang lain (menggunakan alat yang sama, NAMA) memiliki #!/usr/bin/env NAME shebang .

Keduanya tampaknya bekerja dengan benar. Dalam tutorial (di Python, misalnya), tampaknya ada saran bahwa shebang yang terakhir lebih baik. Tapi, saya tidak begitu mengerti mengapa demikian.

Saya menyadari bahwa, untuk menggunakan shebang terakhir, NAME harus di PATH sedangkan shebang pertama tidak memiliki batasan ini.

Juga, tampaknya (bagi saya) bahwa yang pertama akan menjadi shebang yang lebih baik, karena ini menentukan dengan tepat di mana NAME berada. Jadi, dalam kasus ini, jika ada beberapa versi NAME (mis., /usr/bin/NAME, /usr/local/bin/NAME), kasus pertama menentukan mana yang akan digunakan.

Pertanyaan saya adalah mengapa shebang pertama lebih disukai daripada yang kedua?

Jawaban yang Diterima:

Kriteria/Persyaratan Tujuan:

Dalam menentukan apakah akan menggunakan mutlak atau logis (/usr/bin/env ) jalur ke juru bahasa dalam she-bang, ada (2) pertimbangan utama:

a) Penerjemah dapat ditemukan di sistem target

b) Versi yang benar dari penerjemah dapat ditemukan di sistem target

Jika kita SETUJU bahwa “b) ” diinginkan, kami juga setuju bahwa :

c) Sebaiknya skrip kita gagal daripada mengeksekusi menggunakan versi penerjemah yang salah dan berpotensi mencapai hasil yang tidak konsisten.

Jika kami TIDAK SETUJU bahwa “b) ” penting, maka penerjemah apa pun yang ditemukan sudah cukup.

Pengujian:

Sejak menggunakan logis path- /usr/bin/env to interpreter di she-bang adalah solusi yang paling dapat diperluas yang memungkinkan skrip yang sama untuk dieksekusi dengan sukses pada host target dengan jalur berbeda ke interpreter yang sama, kami akan mengujinya- menggunakan Python karena popularitasnya- untuk melihat apakah itu memenuhi kriteria kami.

  1. Apakah /usr/bin/env tinggal di lokasi yang dapat diprediksi dan konsisten di POPULER (bukan “setiap ") Sistem operasi? Ya :
  • RHEL 7.5
  • Ubuntu 18.04
  • Raspbian 10 (“Buster”)
  • OSX 10.15.02
  1. Skrip Python di bawah dijalankan baik di dalam maupun di luar amplop virtual (Pipenv digunakan) selama pengujian:
    #!/usr/bin/env pythonX.x
    import sys
    print(sys.version)
    print('Hello, world!')
    
  2. She-bang dalam skrip diubah dengan nomor versi Python yang diinginkan (semua diinstal pada host yang sama):
  • #!/usr/bin/env python2
  • #!/usr/bin/env python2.7
  • #!/usr/bin/env python3
  • #!/usr/bin/env python3.5
  • #!/usr/bin/env python3.6
  • #!/usr/bin/env python3.7
  1. Hasil yang diharapkan:print(sys.version) . itu =env pythonX.x . Setiap kali ./test1.py dieksekusi menggunakan versi Python terinstal yang berbeda, versi yang benar yang ditentukan dalam she-bang telah dicetak.

  2. Catatan Pengujian:

  • Tes secara eksklusif terbatas pada Python
  • Perl:Seperti Python- HARUS tinggal di /usr/bin menurut FHS
  • Saya belum mencoba setiap kemungkinan kombinasi pada setiap kemungkinan jumlah Sistem Operasi Linux/Unixy dan versi setiap Sistem Operasi.
Terkait:Linux – Mendapatkan kemampuan drive CD/DVD saat wodim –perangkat tidak berfungsi?

Kesimpulan:

Meskipun BENAR bahwa #!/usr/bin/env python akan menggunakan versi pertama Python yang ditemukan di Path pengguna, kita dapat memoderasi perilaku ini dengan menentukan nomor versi seperti #!/usr/bin/env pythonX.x . Memang, pengembang tidak peduli penerjemah mana yang ditemukan “pertama “, yang mereka pedulikan adalah kode mereka dieksekusi menggunakan penerjemah tertentu yang mereka tahu kompatibel dengan kode mereka untuk memastikan hasil yang konsisten- di mana pun yang mungkin tinggal di sistem file

Dalam hal portabilitas/fleksibilitas, menggunakan logis /usr/bin/env – daripada mutlak jalur tidak hanya memenuhi persyaratan a), b) &c) dari pengujian saya dengan berbagai versi Python , tetapi juga memiliki manfaat logika fuzzy untuk menemukan penerjemah versi yang sama meskipun mereka berada di jalur yang berbeda pada Sistem Operasi yang berbeda. Dan meskipun BANYAK distro menghormati FHS, tidak semua melakukannya.

Jadi di mana skrip akan GAGAL jika biner hidup dalam mutlak yang berbeda path kemudian ditentukan dalam Shebang, skrip yang sama menggunakan logis jalur BERHASIL karena terus berjalan hingga menemukan kecocokan, sehingga menawarkan keandalan &ekstensibilitas yang lebih besar di seluruh platform.


Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. /usr/bin Vs /usr/local/bin Di Linux?

  3. Python – Bagaimana /usr/bin/env Mengetahui Program Yang Digunakan?

  1. Linux – Menggabungkan /usr/bin Dan /usr/sbin Ke /bin (gnu/linux)?

  2. Apa perbedaan antara #!/usr/bin/env bash dan #!/usr/bin/bash?

  3. Apa arti dari /usr/sbin, /usr/local/sbin dan /usr/local/bin?

  1. Kapan saya harus menggunakan #!/bin/bash dan kapan #!/bin/sh?

  2. Mengapa meletakkan hal-hal selain /home ke partisi terpisah?

  3. Perbedaan antara /bin dan /usr/bin