Když používám Shebang #!/usr/bin/env python
ke spuštění skriptu, jak systém ví, které python
použít? pokud hledám cestu python
bin v proměnných prostředí, nic nenajdu.
env | grep -i python
Shebang očekává úplnou cestu k použití tlumočníka, takže by následující syntaxe byla nesprávná:
#!python
Nastavení úplné cesty by mohlo fungovat:
#!/usr/local/bin/python
ale nebyl by přenosný, protože python může být nainstalován v /bin
, /opt/python/bin
nebo kdekoli jinde.
Pomocí env
#!/usr/bin/env python
je metoda umožňující přenosný způsob, jak specifikovat OS úplnou cestu ekvivalentní té, kde python
je nejprve umístěn v PATH
.
Řádek Shebang (od „ostrého třesku“, tj. #!
) je zpracováno jádrem. Jádro nechce vědět o proměnných prostředí, jako je PATH
. Takže jméno na řádku Shebang musí být absolutní cestou ke spustitelnému souboru. Můžete také určit další argument, který bude předán tomuto spustitelnému souboru před názvem skriptu (s omezeními závislými na systému, do kterých sem nepůjdu). Například pro skript Python skript) můžete určit
#!/usr/bin/python
na prvním řádku a při spuštění skriptu jádro ve skutečnosti spustí /usr/bin/python /path/to/script
. To však není vhodné: musíte zadat úplnou cestu příkazu. Co když máte python
v /usr/bin
na některých strojích a /usr/local/bin
na ostatních? Nebo chcete nastavit hodnotu PATH
na /home/joe/opt/python-2.5/bin
aby bylo možné použít konkrétní verzi Pythonu? Protože jádro pro vás neprovede vyhledávání PATH
, je myšlenkou, aby jádro spustilo příkaz, který postupně vyhledá požadovaný interpret v PATH
:
#!/fixed/path/to/path-lookup-command python
Že path-lookup-command
musí pojmenovat spustitelný soubor jako argument a vyhledat ho v PATH
a spustit: jádro spustí /fixed/path/to/path-lookup-command python /path/to/script
. Jak se to stane, příkaz env
to právě dělá. Jeho hlavním účelem je spustit příkaz s jiným prostředím, ale protože vyhledá název příkazu v $PATH
, je to pro náš účel ideální.
Ačkoli to není oficiálně zaručeno, historické unixové systémy poskytovaly env
v /usr/bin
a moderní systémy si toto umístění udržely přesně kvůli rozsáhlému použití #!/usr/bin/env
. V praxi tedy způsob, jak určit, že skript musí být proveden oblíbeným uživatelem Python interpret je
#!/usr/bin/env python
Dobře, tak běžte:
env | grep PATH
Váš $ PATH je seznam adresářů. Unix projde seznamem adresářů, dokud nenajde "python".
Můžete zjistit, který adresář najde příkazem 'který':
which python