PATH (proměnná)

PATH je v informatice název proměnné, která v některých operačních systémech obsahuje seznam adresářů, ve kterých jsou umístěny spustitelné soubory. Proměnnou PATH nalezneme v unixových systémech, DOSu, OS/2 i v Microsoft Windows. Uživatel může v příkazovém řádku jednoduše zadat název spustitelného souboru bez specifikace cesty k danému příkazu a interpret příkazů (shell) se ho pokusí najít ve všech adresářích, které jsou obsaženy v proměnné PATH. Teprve když v nich není nalezen, zahlásí uživateli chybu (obvykle ve smyslu „Příkaz nenalezen“, anglicky „Command not found“ a podobně).

V operačních systémech je proměnná PATH obvykle součástí proměnných prostředí, což zajišťuje její dědění do nově vzniklých procesů. Proměnná PATH zlehčuje spouštění často používaných programů umístěných ve vlastních adresářích. Pokud jsou ale v proměnné PATH názvy adresářů seřazeny neefektivně, zpomaluje to běh operačního systému – hledá se v mnoha složkách, tedy i na nesprávných místech.

Unixové systémy

V unixových systémech je proměnná PATH děděna potomkem po systémovém volání fork(). Seznam adresářů je oddělen znakem dvojtečka.

$ echo $PATH
/sbin:/usr/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/huzva/bin

Ve výše uvedeném příkladu zadal uživatel na prvním řádku příkaz pro vypsání proměnné PATH, který je vyznačen tučně. Obsah proměnné PATH je vypsán na druhém řádku. Adresáře /bin, /usr/bin a /usr/local/bin jsou vkládány do většiny uživatelských nastavení (vždy ale záleží na konkrétní implementaci). Správce počítače má navíc zařazeny adresáře /sbin a /usr/sbin, aby mohl jednoduše provádět příkazy pro správu systému.

Když uživatel zadá do příkazového řádku příkaz nebo je-li z nějakého programu vykonáno volání exec(), systém prohledá zleva doprava všechny adresáře uvedené v proměnné PATH a spustí první příkaz, který takto najde.

Aktuální adresář v PATH

V unixových systémech obvykle není v proměnné PATH uveden aktuální adresář (.) a neprohledávají ho ani interpret příkazů (shell) ani systémová volání exec(). Důsledkem je, že když chce uživatel spustit skript (nebo program) ze složky, ve které se právě nachází (a není to jeden z adresářů uvedený v PATH), musí uvést relativní cestu (./script.sh) nebo absolutní cestu (např. /home/huzva/script.sh).

Důvodem je bezpečnostní riziko kvůli možnému zneužití útočníkem nebo škodlivým malwarem, kdy by mohl kdokoliv vložit škodlivý příkaz například do adresáře /tmp a pak jen čekat, až se uživatel (nebo správce) do tohoto adresáře přepne a tento příkaz zadá. Přednostní provedení vloženého škodlivého příkazu by pak proběhlo bez vědomí oběti útoku. Podobně by mohl být na různých místech systému narafičen příkaz obvyklých překlepů (například zápis s chybějící mezerou ls-l).

DOS, Microsoft Windows

V systémech DOS, OS/2 a Microsoft Windows je seznam adresářů oddělen znakem středník. V následujícím příkladu je příkaz pro výpis proměnné PATH uveden na prvním řádku a je vyznačen tučně:

C:\Users\Iva>echo %PATH%
C:\Windows\system32;C:\Windows

Typicky je prvním adresářem uvedeným v PATH složka C:\WINDOWS\system32 a dále jsou přítomny názvy mnoha adresářů (ale ne všech), kde je instalován nějaký program určený pro volání z příkazového řádku. Některé programy vkládají během instalace názvy svých adresářů do proměnné PATH nikoliv na konec, ale na začátek seznamu. Důvodem je, aby v případě spouštění netrvalo jejich vyhledávání dlouho nebo aby překryly jiné příkazy, které jsou v adresářích uvedených později (např. systémové nástroje z adresáře C:\Windows\system32). V éře DOSu bylo obvyklé vkládat proměnnou PATH do souboru AUTOEXEC.BAT tímto způsobem:

PATH {program directory};%PATH%

nebo

SET PATH={program directory};%PATH%.

Prohledání aktuálního adresáře

Ve všech zmíněných systémech (DOS, OS/2 a Microsoft Windows) je po vložení příkazu nebo při systémovém volání nejdříve prohledán pracovní adresář (.) a teprve až poté jsou zleva doprava prohledány adresáře uvedené v proměnné PATH. Bezpečnostní riziko, jak je popsáno výše v kapitole pro unixové systémy, v těchto systémech existuje také, ale má relativně menší dopad, protože jsou tyto systémy typicky používány pouze jednou osobou a uživatelé v příkazovém řádku pracují zřídka.

Související články