/ Usr / bin / env hangi programı kullanacağını nasıl bilir?


62

Shebang'ı #!/usr/bin/env pythonbir betiği çalıştırmak pythoniçin kullandığımda , sistem hangisinin kullanılacağını nasıl biliyor ? pythonOrtam değişkenlerinde bir bin yolu ararsam hiçbir şey bulamam.

env | grep -i python

6
oh sanırım ben düşündüm ki - bu sadece $ python için 'python' arar
tMC

Bunu da merak ettim. Ve neden / usr / bin / env? / bin / env ya da env'nin aksine, eğer sadece env'den bir yol listesi alıyorsa?
Faheem Mitha

Sadece 'env' çalışmaz çünkü tam yol olması gerekir. 'Env' programı genellikle / user / bin / env konumunda bulunur. Bazı dağıtımlarda / bin / env olarak da bulunabilir, ancak / usr / bin / env ile gitmek daha güvenlidir.
21'de rettoplar

Yanıtlar:


54

Shebang, aşağıdaki sözdiziminin yanlış olması için tercümanın kullanması için tam yol bekler:

#!python

Böyle bir tam yol ayarlamak işe yarayabilir:

#!/usr/local/bin/python

piton kurulabilir edebileceğiniz gibi ama sigara taşınabilir olacağını /bin, /opt/python/bindiğer konum veya her yerde.

kullanma env

#!/usr/bin/env python

taşınabilir bir yolun OS'ye pythonilk içinde bulunduğu yere eşdeğer bir tam yol belirlemesini sağlayan bir yöntemdir PATH.


56

Shebang ( “sivri patlama”, yani, satır #!) çekirdek tarafından işlenir. Çekirdek gibi çevre değişkenleri hakkında bilmek istemiyor PATH. Bu yüzden shebang satırındaki ad çalıştırılabilir bir yol olmalıdır. Ayrıca, komut dosyasından önce o yürütülebilir dosyaya geçmek için ek bir argüman belirleyebilirsiniz (sisteme bağlı kısıtlamalarla buraya girmeyeceğim). Örneğin, bir Python betiği için belirtebilirsiniz.

#!/usr/bin/python

ilk satırda ve betiği çalıştırdığınızda, çekirdek aslında yürütülür /usr/bin/python /path/to/script. Ancak bu uygun değildir: komutun tam yolunu belirtmeniz gerekir. Ne varsa pythoniçinde /usr/binbazı makinelerde ve /usr/local/bindiğerleri üzerinde? Ya da ayarlamak istediğiniz PATHiçin /home/joe/opt/python-2.5/bino kadar Python belirli bir sürümünü kullanmak kadar? Çekirdek PATHsizin için arama yapamayacağından, fikir, çekirdeğin istenen tercümana bakacağı bir komutu çalıştırmasını sağlamaktır PATH:

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

Bu path-lookup-commandbağımsız değişken olarak bir yürütülebilir adını alıp bunu aramak gerekir PATHve çalıştırmak: Çekirdek çalışacaktır /fixed/path/to/path-lookup-command python /path/to/script. Olduğu gibi, envkomut tam da bunu yapıyor. Asıl amacı, farklı bir çevreye sahip bir komut çalıştırmaktır, ancak komut adına baktığından $PATH, buradaki amacımız için mükemmeldir.

Bu resmen garanti olmasa da, tarihi Unix sistemleri temin envyılında /usr/bin, modern sistemler nedeniyle yaygın kullanımı tam da bu konumunu tutmuş #!/usr/bin/env. Bu nedenle, pratikte, bir betiğin kullanıcının en sevdiği Python yorumlayıcısı tarafından yürütülmesi gerektiğini belirtme yöntemi

#!/usr/bin/env python

2
hangisi envve arasında tercih edilir which? o zaman da PATH ortamımdan en uygun çalıştırılabilir dosyalara sahip olacaksınız.
Nikhil Mulley

8
@NikhilMulley whichçalıştırılabilir dosyayı bulur ve yolunu yazdırır. envİlk argüman tarafından belirtilen programı bulur ve kalan argümanları ileterek çalıştırır.
Kevin

3
öyleyse bu envaslında bir eval versiyonu which.
Nikhil Mulley

6

Tamam, koş o zaman:

env | grep PATH

$ PATH, bir dizin listesidir. Unix, "python" u bulunana kadar, bu dizinler listesinden geçecektir.

'Hangi' komutuyla hangi dizini bulduğunu görebilirsiniz:

which python

İlginçtir ki, sys.pathaktif bir 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']) ve ./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']) arasında pitonda bir fark görüyorum .
ThorSummoner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.