Proměnná $PATH v Linuxu: Tichý správce vašich příkazů
Proměnná $PATH je nenápadný, ale klíčový prvek fungování vašeho linuxového systému. I když si toho možná nejste vědomi, významně ovlivňuje způsob, jakým používáte svůj počítač. V tomto článku si vysvětlíme, jak $PATH funguje a jak ji můžete přizpůsobit.
Jak funguje $PATH?
Kdykoliv zadáte příkaz do terminálu a stisknete klávesu Enter, spustí se řada procesů. Ještě než je váš příkaz vůbec proveden, musí systém zjistit, co přesně má udělat.
Pro většinu distribucí Linuxu je výchozím shellem Bash. Ten analyzuje text, který zadáte, a rozlišuje mezi samotnými příkazy, jejich parametry, rourami a přesměrováním. Následně Bash vyhledá spustitelné soubory, které odpovídají zadaným příkazům, a ty s parametry spustí.
Nejprve je nutné ověřit, zda se jedná o vestavěný příkaz shellu, nebo zda se jedná o binární soubor. Pokud je příkaz součástí shellu (tedy je vestavěný), není potřeba žádné další vyhledávání. Tyto vestavěné příkazy jsou součástí shellu a jsou okamžitě dostupné.
Nicméně, pokud potřebujete použít externí nástroj, musí shell prohledat určená místa v systému. Právě zde přichází na řadu proměnná prostředí $PATH. Obsahuje seznam adresářů, ve kterých shell hledá spustitelné soubory, a také stanovuje pořadí, ve kterém se tyto adresáře prohledávají.
Pro zjištění, zda je příkaz vestavěný, alias, funkce, nebo binární soubor, můžete použít příkaz type
, jak je ukázáno níže:
type clear
type cd
Výše uvedený příklad ukazuje, že příkaz clear
je binární soubor, který se nachází v adresáři `/usr/bin`. I když může být na vašem počítači více verzí příkazu clear
, shell použije tu, kterou najde jako první v cestě. Naproti tomu příkaz cd
je vestavěný příkaz shellu.
Zobrazení obsahu proměnné $PATH
Je snadné zjistit, které adresáře jsou zahrnuty ve vaší proměnné $PATH. Použijte příkaz echo
pro zobrazení hodnoty uložené v proměnné $PATH:
echo $PATH
Výstupem je seznam adresářů v systému souborů, které jsou odděleny dvojtečkami (:). Shell prochází cestu zleva doprava a hledá v každém adresáři odpovídající spustitelný soubor pro provedení zadaného příkazu.
Zde je příklad, jak může vypadat $PATH:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
Důležité je, že vyhledávání nezačíná v aktuálním adresáři, ale pouze v adresářích uvedených v proměnné $PATH. Pokud tedy spustitelné soubory nejsou v adresářích uvedených v cestě, shell je nenajde.
Pro demonstraci jsme vytvořili malý program s názvem `rf`. Při spuštění zobrazí adresář, ze kterého byl spuštěn. Program se nachází v `/usr/local/bin`, ale novější verze je také v adresáři `/dave/work`. Chceme zjistit, kterou verzi programu rf
shell použije. K tomu použijeme příkaz which
, který zobrazí cestu k nalezenému spustitelnému souboru:
which rf
Shell ukazuje, že se používá verze z adresáře, který je v proměnné $PATH.
Spuštěním příkazu rf
se potvrdí, že byla spuštěna verze 1.0 z adresáře `/usr/local/bin`:
rf
Pokud chceme spustit jinou verzi rf
, musíme zadat celou cestu k jejímu spustitelnému souboru:
./work/rf
Tím jsme shellu přesně určili, kterou verzi programu rf
chceme spustit, a proto se použila verze 1.1 z adresáře `/dave/work`. Pokud bychom preferovali tuto verzi, mohli bychom ji zkopírovat do adresáře `/usr/local/bin`, čímž bychom přepsali starou verzi.
Představme si, že vyvíjíme novou verzi programu rf
. Během vývoje a testování jej potřebujeme spouštět často, ale nechceme instalovat nedokončenou verzi do ostrého prostředí. Nebo možná jsme stáhli novou verzi programu a chceme ji důkladně otestovat před tím, než ji zpřístupníme uživatelům.
Pokud přidáme náš pracovní adresář do proměnné $PATH, shell najde naši novou verzi. Změna se dotkne pouze nás, ostatní uživatelé budou nadále používat verzi z adresáře `/usr/local/bin`.
Jak přidat adresář do $PATH
Adresář do proměnné $PATH můžete přidat pomocí příkazu export
. Přidáním adresáře do $PATH ho zahrnete do seznamu, který shell prohledává. Protože shell přestane hledat, jakmile najde první odpovídající spustitelný soubor, je dobré zajistit, aby byl váš adresář prohledáván před adresářem `/usr/local/bin`.
Je to jednoduché. Pro přidání našeho pracovního adresáře `/home/dave/work` na začátek cesty použijeme následující příkaz:
export PATH=/home/dave/work:$PATH
Tento příkaz nastaví proměnnou $PATH
tak, že se rovná novému adresáři `/home/dave/work` a k němu se připojí původní obsah $PATH
.
První výskyt PATH
nemá znak dolaru ($), protože nastavujeme hodnotu pro tuto proměnnou. Druhý výskyt $PATH
znak dolaru má, protože odkazujeme na obsah uložený v proměnné PATH
. Všimněte si také dvojtečky (:) mezi novým adresářem a obsahem proměnné $PATH
.
Nyní se podíváme, jak vypadá cesta:
echo $PATH
Náš adresář `/home/dave/work` se objevil na začátku cesty. Dvojtečka jej odděluje od zbytku původní cesty.
Ověříme, že naše verze programu rf
je nalezena jako první, pomocí příkazu which
:
which rf
A opět spuštěním příkazu rf
se ujistíme, že se spustila verze 1.1 z `/home/dave/work`:
rf
Pokud chceme přidat adresář na konec cesty, jednoduše jej přesuneme na konec příkazu, například takto:
export PATH=$PATH:/home/dave/work
Trvalé změny v proměnné $PATH
Jak řekla Beth Brooke-Marciniak: „Úspěch je dobrý, ale úspěch je pomíjivý“. Jakmile zavřete okno terminálu, všechny změny, které jste provedli v proměnné $PATH, zmizí. Abyste zajistili, že změny budou trvalé, musíte příkaz export
vložit do konfiguračního souboru.
Umístěním příkazu export
do souboru .bashrc
se proměnná $PATH nastaví při každém otevření nového terminálu. Pro SSH relace, pro které se musíte přihlásit, platí „interaktivní“ relace.
V minulosti se pro nastavení proměnné $PATH při přihlášení k terminálové relaci vkládal příkaz export
do souboru .profile
.
Avšak zjistili jsme, že pokud příkaz export
vložíme do souborů .bashrc
i .profile
, správně se nastaví cesta pro interaktivní i přihlašovací relace. Vaše zkušenost se ale může lišit. Pro jistotu si ukážeme, jak to udělat v obou souborech.
Pomocí následujícího příkazu upravte soubor .bashrc
, který se nachází ve vašem domovském adresáři:
gedit .bashrc
Otevře se editor gedit se souborem .bashrc
.
Přejděte na konec souboru a přidejte následující příkaz export
, který jsme již použili:
export PATH=/home/dave/work:$PATH
Uložte soubor. Poté buď zavřete a znovu otevřete okno terminálu, nebo použijte příkaz tečka (.
) pro načtení souboru .bashrc
:
. .bashrc
Následně pomocí příkazu echo
zkontrolujte, zda se proměnná $PATH správně aktualizovala:
echo $PATH
Tím se na začátek cesty přidá adresář `/home/dave/work`.
Postup pro 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. Pouhé zavření a otevření nového okna terminálu nestačí k opětovnému načtení souboru .profile
. Pro aktivování nového nastavení se musíte odhlásit a znovu přihlásit, nebo použít příkaz tečka:
. .profile
Nastavení $PATH pro všechny uživatele
Pokud chcete nastavit proměnnou $PATH pro všechny uživatele systému, můžete upravit soubor /etc/profile
.
Pro úpravu tohoto souboru budete potřebovat oprávnění správce (root). Použijte příkaz 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. Změny se projeví pro všechny uživatele při příštím přihlášení.
Bezpečnostní upozornění
Dávejte pozor, abyste omylem nepřidali na začátek cesty dvojtečku (:
), jak je znázorněno níže:
Pokud to uděláte, prohledá se jako první aktuální adresář, což představuje bezpečnostní riziko. Představte si, že stáhnete archivní soubor a rozbalíte ho do adresáře. Při prohlížení souborů narazíte na další zazipovaný soubor. Chcete-li archiv rozbalit, znovu použijete příkaz unzip
.
Pokud však první archiv obsahoval spustitelný soubor s názvem unzip
, který byl škodlivý, omylem byste spustili tento soubor namísto skutečného spustitelného příkazu unzip
. 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ů export
buďte vždy opatrní. Používejte příkaz echo $PATH
ke kontrole, zda je proměnná $PATH nastavena dle vašich představ.