$PATH je jedním z tichých manipulátorů na pozadí vašeho linuxového počítače. Tiše to ovlivňuje vaši uživatelskou zkušenost, ale není na tom nic stinného. Vysvětlíme vám, co dělá a jak jej můžete upravit.
Table of Contents
Co je $PATH na Linuxu a jak funguje?
Když napíšete příkaz do okna terminálu a stisknete Enter, spustíte poměrně hodně aktivity ještě předtím, než je váš příkaz vůbec proveden.
Bash je výchozí shell na většině distribucí Linuxu. Interpretuje řádek textu, který jste zadali, a identifikuje názvy příkazů promíchané s parametry, rourami, přesměrovánía cokoli dalšího tam je. Poté vyhledá spustitelné binární soubory pro tyto příkazy a spustí je s parametry, které jste zadali.
Prvním krokem shellu k nalezení spustitelného souboru je identifikace, zda se jedná o binární soubor. Pokud je příkaz, který používáte, v samotném shellu (a „vestavěná skořepina“) není potřeba žádné další hledání.
Vestavěné moduly shellu jsou nejsnáze k nalezení, protože jsou nedílnou součástí shellu. Je to jako mít je v pásku – jsou vždy s vámi.
Pokud však potřebujete některý ze svých dalších nástrojů, musíte se jít prohrabat v dílně, abyste ho našli. Je to na vašem pracovním stole nebo na nástěnném věšáku? To dělá proměnná prostředí $PATH. Obsahuje seznam míst, která shell prohledává, a pořadí, ve kterém budou prohledávána.
Pokud chcete zjistit, zda je příkaz a vestavěný shell, alias, funkce nebo samostatný binární mv /work/unfile, můžete použít příkaz type, jak je uvedeno níže:
type clear
type cd
To nám říká, že clear je binární soubor a první nalezený v cestě se nachází v /usr/bin. Možná máte na svém počítači nainstalovanou více než jednu verzi clear, ale právě tuto se shell pokusí použít.
Není překvapením, že cd je vestavěný shell.
Výpis vaší $PATH
Je snadné vidět, co vám stojí v cestě. Chcete-li použít příkaz echo, zadejte následující a vytisknout hodnotu uložen v proměnné $PATH:
echo $PATH
Výstupem je seznam umístění systému souborů oddělených dvojtečkou (:). Shell prohledává cestu zleva doprava a kontroluje každé umístění souborového systému, zda neobsahuje odpovídající spustitelný soubor pro provedení vašeho příkazu.
Můžeme si vybrat cestu přes seznam, abychom viděli umístění systému souborů, která budou prohledána, a pořadí, ve kterém budou prohledávána:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/zásobník
/usr/games
/usr/local/games
/snap/bin
Něco, co nemusí být hned zřejmé, je, že vyhledávání nezačíná v aktuálním pracovním adresáři. Spíše to funguje přes uvedené adresáře a pouze uvedené adresáře.
Pokud aktuální pracovní adresář není ve vaší cestě, nebude prohledán. Také pokud máte příkazy uložené v adresářích, které nejsou v cestě, shell je nenajde.
Abychom to demonstrovali, vytvořili jsme malý program nazvaný rf. Po spuštění vypíše rf v okně terminálu název adresáře, ze kterého byl spuštěn. Nachází se v /usr/local/bin. Novější verzi máme také v adresáři /dave/work.
Zadáme následující který příkaz aby nám ukázal, jakou verzi našeho programu shell najde a použije:
which rf
Shell hlásí, že nalezená verze je ta v adresáři, který je v cestě.
Pro spuštění zadáme následující:
rf
Verze 1.0 rf běží a potvrzuje, že naše očekávání byla správná. Nalezená a spuštěná verze se nachází v /usr/local/bin.
Chcete-li na tomto počítači spustit jakoukoli jinou verzi rf, budeme muset použít cestu ke spustitelnému souboru na příkazovém řádku, jak je znázorněno níže:
./work/rf
Nyní, když jsme shellu řekli, kde najde verzi rf, kterou chceme spustit, používá verzi 1.1. Pokud preferujeme tuto verzi, můžeme ji zkopírovat do adresáře /usr/local/bin a přepsat starou.
Řekněme, že vyvíjíme novou verzi rf. Při vývoji a testování jej budeme muset spouštět často, ale nechceme kopírovat nevydané vývojové sestavení do živého prostředí.
Nebo jsme si možná stáhli novou verzi rf a chceme na ní provést nějaké ověřovací testy, než ji zpřístupníme veřejnosti.
Pokud do cesty přidáme náš pracovní adresář, shell najde naši verzi. A tato změna se dotkne pouze nás – ostatní budou stále používat verzi rf v /usr/local/bin .
Přidání adresáře do vaší $PATH
Můžete použít příkaz export to přidat adresář na $PATH. Adresář je pak zahrnut do seznamu umístění systému souborů, která shell prohledává. Když shell najde odpovídající spustitelný soubor, zastaví vyhledávání, takže se chcete ujistit, že nejprve prohledá váš adresář, před /usr/local/bin.
To je snadné. V našem příkladu zadáme následující, abychom přidali náš adresář na začátek cesty, aby to bylo první prohledávané umístění:
export PATH=/home/dave/work:$PATH
Tento příkaz nastaví $PATH tak, aby se rovnala adresáři, který přidáváme, /home/dave/work a poté celé aktuální cestě.
První PATH nemá znak dolaru ($). Nastavíme hodnotu pro PATH. Poslední $PATH má znak dolaru, protože odkazujeme na obsah uložený v proměnné PATH. Všimněte si také dvojtečky (:) mezi novým adresářem a názvem proměnné $PATH.
Pojďme se nyní podívat, jak cesta vypadá:
echo $PATH
Náš adresář /home/dave/work je přidán na začátek cesty. Dvojtečka, kterou jsme poskytli, ji odděluje od zbytku cesty.
Zadáme následující, abychom ověřili, že naše verze rf je první nalezená:
which rf
Důkaz v pudinku běží rf, jak je znázorněno níže:
rf
Shell najde verzi 1.1 a spustí ji z /home/dave/work.
Chcete-li přidat náš adresář na konec cesty, jednoduše jej přesuneme na konec příkazu, například takto:
export PATH=$PATH:/home/dave/work
Provádění trvalých změn
Tak jako Beth Brooke-Marciniak řekl: „Úspěch je dobrý, ale úspěch je pomíjivý.“ Ve chvíli, kdy zavřete okno terminálu, všechny změny, které jste provedli v $PATH, jsou pryč. Aby byly trvalé, musíte příkaz exportu vložit do konfiguračního souboru.
Když vložíte příkaz export do souboru .bashrc, nastaví cestu pokaždé, když otevřete okno terminálu. Na rozdíl od SSH relace, pro které se musíte přihlásit, se nazývají „interaktivní“ relace.
V minulosti jste do souboru .profile vložili příkaz export, abyste nastavili cestu pro přihlášení k terminálovým relacím.
Zjistili jsme však, že pokud vložíme příkaz export buď do souborů .bashrc nebo .profile, správně nastaví cestu jak pro interaktivní, tak i pro přihlašovací terminálové relace. Vaše zkušenost může být jiná. Abychom zvládli všechny eventuality, ukážeme si, jak to udělat v obou souborech.
Pomocí následujícího příkazu v adresáři /home upravte soubor .bashrc:
gedit .bashrc
Otevře se editor gedit s načteným souborem .bashrc.
Přejděte na konec souboru a poté přidejte následující příkaz exportu, který jsme použili dříve:
export PATH=/home/dave/work:$PATH
Uložte soubor. Dále buď zavřete a znovu otevřete okno terminálu, nebo použijte příkaz tečka ke čtení souboru .bashrc, a to následovně:
. .bashrc
Poté zadejte následující příkaz echo a zkontrolujte cestu:
echo $PATH
Tím se na začátek cesty přidá adresář /home/dave/work.
Postup přidání příkazu do souboru .profile je stejný. Zadejte následující příkaz:
gedit .profile
Editor gedit se spustí s načteným souborem .profile.
Přidejte příkaz export na konec souboru a poté jej uložte. Zavření a otevření nového okna terminálu nestačí k vynucení opětovného načtení souboru .profile. Aby se nové nastavení projevilo, musíte se odhlásit a znovu přihlásit nebo použít příkaz tečka, jak je uvedeno níže:
. .profile
Nastavení cesty pro každého
Chcete-li nastavit cestu pro každého, kdo používá systém, můžete upravit soubor /etc/profile.
Budete muset použít sudo následovně:
sudo gedit /etc/profile
Po spuštění editoru gedit přidejte na konec souboru příkaz export.
Uložte a zavřete soubor. Pro ostatní se změny projeví při příštím přihlášení.
Poznámka k bezpečnosti
Ujistěte se, že jste omylem nepřidali do cesty úvodní dvojtečku „:“, jak je znázorněno níže.
Pokud tak učiníte, prohledá se nejprve aktuální adresář, což představuje bezpečnostní riziko. Řekněme, že jste si stáhli archivní soubor a rozbalili jej do adresáře. Podíváte se na soubory a uvidíte další zazipovaný soubor. Chcete-li archiv extrahovat, zavoláte ještě jednou unzip.
Pokud první archiv obsahoval spustitelný soubor s názvem unzip, který byl škodlivý spustitelný soubor, omylem byste spustili tento soubor namísto skutečného spustitelného souboru rozbalení. To by se stalo, protože shell by se nejprve podíval do aktuálního adresáře.
Při zadávání příkazů pro export buďte vždy opatrní. Použijte echo $PATH k jejich kontrole a ujistěte se, že jsou takové, jaké chcete, aby byly.