Ketika saya menggunakan shebang #!/usr/bin/env python
untuk menjalankan skrip, bagaimana sistem tahu mana yang python
harus digunakan? jika saya mencari python
path bin dalam variabel lingkungan saya tidak menemukan apa pun.
env | grep -i python
Ketika saya menggunakan shebang #!/usr/bin/env python
untuk menjalankan skrip, bagaimana sistem tahu mana yang python
harus digunakan? jika saya mencari python
path bin dalam variabel lingkungan saya tidak menemukan apa pun.
env | grep -i python
Jawaban:
Shebang mengharapkan path lengkap ke interpreter untuk digunakan sehingga sintaks berikut akan salah:
Menyetel path lengkap seperti ini mungkin berhasil:
tapi akan non portable seperti python mungkin dipasang di
/bin
,/opt/python/bin
, atau di mana pun lokasi lain.Menggunakan
env
adalah metode yang memungkinkan cara portabel untuk menentukan ke OS path lengkap setara dengan yang mana
python
pertama kali terletak diPATH
.sumber
Garis shebang (dari "bang tajam", yaitu
#!
) diproses oleh kernel. Kernel tidak ingin tahu tentang variabel lingkungan sepertiPATH
. 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 bisa menentukanpada baris pertama, dan ketika Anda menjalankan skrip, kernel sebenarnya akan mengeksekusi
/usr/bin/python /path/to/script
. Tapi itu tidak nyaman: Anda perlu menentukan path lengkap dari perintah. Bagaimana jika Anda memilikipython
di/usr/bin
beberapa mesin dan/usr/local/bin
pada orang lain? Atau Anda ingin mengatur AndaPATH
untuk/home/joe/opt/python-2.5/bin
sehingga untuk menggunakan versi tertentu dari Python? Karena kernel tidak akan melakukanPATH
pencarian untuk Anda, idenya adalah membuat kernel menjalankan perintah yang pada gilirannya mencari penerjemah yang diinginkan diPATH
:Itu
path-lookup-command
harus mengambil nama yang dapat dieksekusi sebagai argumen dan mencarinyaPATH
dan menjalankannya: kernel akan berjalan/fixed/path/to/path-lookup-command python /path/to/script
. Ketika itu terjadi,env
perintah tidak hanya itu. Tujuan utamanya adalah untuk menjalankan perintah dengan lingkungan yang berbeda, tetapi karena mencari nama perintah$PATH
, itu sempurna untuk tujuan kita di sini.Meskipun ini tidak secara resmi dijamin, sistem Unix bersejarah disediakan
env
di/usr/bin
, dan sistem modern telah disimpan lokasi itu justru karena meluasnya penggunaan#!/usr/bin/env
. Jadi, dalam praktiknya, cara untuk menentukan bahwa skrip harus dijalankan oleh interpreter Python favorit pengguna adalahsumber
env
danwhich
? karena itu juga akan mendapatkan executable paling memenuhi syarat dari lingkungan PATH saya.which
menemukan executable dan mencetak path-nya.env
menemukan program yang ditentukan oleh argumen pertama dan menjalankannya, meneruskannya dengan argumen yang tersisa.env
versi evalwhich
dasarnya.Benar, jadi jalankan:
$ 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':
sumber
sys.path
antara env$ env python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
) dan./env/bin/python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']
) yang diaktifkan .