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:
#!python
Menyetel path lengkap seperti ini mungkin berhasil:
#!/usr/local/bin/python
tapi akan non portable seperti python mungkin dipasang di /bin
, /opt/python/bin
, atau di mana pun lokasi lain.
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
.
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 bisa menentukan
#!/usr/bin/python
pada 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 memiliki python
di /usr/bin
beberapa mesin dan /usr/local/bin
pada orang lain? Atau Anda ingin mengatur Anda PATH
untuk /home/joe/opt/python-2.5/bin
sehingga untuk menggunakan versi tertentu dari Python? Karena kernel tidak akan melakukan PATH
pencarian untuk Anda, idenya adalah membuat kernel menjalankan perintah yang pada gilirannya mencari penerjemah yang diinginkan di PATH
:
#!/fixed/path/to/path-lookup-command python
Itu path-lookup-command
harus mengambil nama yang dapat dieksekusi sebagai argumen dan mencarinya PATH
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 adalah
#!/usr/bin/env python
env
dan which
? 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 eval which
dasarnya.
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
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 .