it-swarm-id.com

Bagaimana / usr / bin / env tahu program mana yang digunakan?

Ketika saya menggunakan Shebang #!/usr/bin/env python untuk menjalankan skrip, bagaimana sistem mengetahui python mana yang akan digunakan? jika saya mencari path bin python dalam variabel environment saya tidak menemukan apa pun.

env | grep -i python
65
tMC

Shebang mengharapkan path lengkap ke interpreter untuk digunakan sehingga sintaks berikut akan salah:

#!python

Menyetel path lengkap seperti ini mungkin berhasil:

#!/usr/local/bin/python

tetapi akan menjadi non portable karena python mungkin dipasang di /bin, /opt/python/bin, atau dimanapun lokasi lainnya.

Menggunakan env

#!/usr/bin/env python

adalah metode yang memungkinkan cara portabel untuk menentukan ke OS path lengkap setara dengan yang mana python pertama kali terletak di PATH.

55
jlliagre

Garis Shebang (dari “bang tajam”, yaitu #!) diproses oleh kernel. Kernel tidak ingin tahu tentang variabel lingkungan seperti PATH. Jadi nama pada baris Shebang harus menjadi jalur absolut ke executable. Anda juga dapat menentukan argumen tambahan untuk diteruskan ke yang dapat dieksekusi sebelum nama skrip (dengan pembatasan yang bergantung pada sistem saya tidak akan masuk ke sini). Misalnya, untuk skrip Python, Anda dapat menentukan

#!/usr/bin/python

pada baris pertama, dan ketika Anda menjalankan skrip, kernel sebenarnya akan menjalankan /usr/bin/python /path/to/script. Tapi itu tidak nyaman: Anda perlu menentukan path lengkap dari perintah. Bagaimana jika Anda memiliki python dalam /usr/bin pada beberapa mesin dan /usr/local/bin pada orang lain? Atau Anda ingin mengatur PATH ke /home/joe/opt/python-2.5/bin untuk menggunakan versi Python tertentu? Karena kernel tidak akan melakukan pencarian PATH untuk Anda, idenya adalah membuat kernel menjalankan perintah yang pada gilirannya mencari penerjemah yang diinginkan dalam PATH:

#!/fixed/path/to/path-lookup-command python

Itu path-lookup-command harus mengambil nama yang dapat dieksekusi sebagai argumen dan mencarinya di PATH dan menjalankannya: kernel akan menjalankan /fixed/path/to/path-lookup-command python /path/to/script. Seperti yang terjadi, perintah env melakukan hal itu. Tujuan utamanya adalah untuk menjalankan perintah dengan lingkungan yang berbeda, tetapi karena mencari nama perintah di $PATH, itu sempurna untuk tujuan kita di sini.

Meskipun ini tidak dijamin secara resmi, sistem Unix yang bersejarah menyediakan env in /usr/bin, dan sistem modern telah menjaga lokasi itu justru karena meluasnya penggunaan #!/usr/bin/env. Jadi, dalam praktiknya, cara untuk menentukan bahwa skrip harus dijalankan oleh favorit pengguna Python penerjemah adalah

#!/usr/bin/env python

Benar, jadi jalankan:

env | grep PATH

$ PATH Anda adalah daftar direktori. Unix akan memeriksa daftar direktori, secara berurutan, hingga ia menemukan "python".

Anda dapat melihat direktori mana yang ditemukannya dengan perintah 'mana':

which python
7
Dan Rue