it-swarm-eu.dev

Jak / usr / bin / env ví, který program použít?

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
65
tMC

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.

55
jlliagre

Řá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
7
Dan Rue