Jak používat který příkaz v Linuxu

Příkaz v Linuxu, který slouží k nalezení spustitelného souboru, jež se aktivuje při zadání příkazu do shellu. Jestliže máte v počítači různé verze stejné aplikace, tento příkaz vám pomůže zjistit, kterou konkrétně shell spustí.

Binární soubory a systémové cesty

Když se pokoušíte z terminálu spustit nějaký program, shell (typicky Bash v moderních distribucích) musí daný příkaz najít a provést. Některé příkazy, jako například cd, history a pwd, jsou součástí shellu, takže Bash je nemusí složitě vyhledávat.

Jak však Bash nachází ostatní příkazy, programy a externí samostatné binární soubory? Využívá k tomu takzvanou cestu, což je soubor adresářů. V každém z těchto adresářů se snaží najít spustitelný soubor, který odpovídá zadanému příkazu nebo programu. Jakmile nalezne odpovídající soubor, Bash jej spustí a hledání ukončí.

Pomocí příkazu echo můžete zobrazit obsah proměnné prostředí $PATH a tím i seznam adresářů, které tvoří cestu. Stačí zadat příkaz a potvrdit klávesou Enter:

echo $PATH

Jednotlivé cesty jsou v seznamu odděleny dvojtečkou (:). Na jednom testovacím počítači Bash prohledával tyto adresáře v uvedeném pořadí:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

V systému souborů se nachází několik složek s názvy /sbin a /bin, což může působit zmatek.

Analýza systémových cest

Představme si, že máme aktualizovanou verzi programu nazvaného htg. Nachází se v aktuálním adresáři a spustíme jej pomocí příkazu:

./htg

Tento program jen vypíše číslo verze a následně se ukončí. Nová verze má označení 1.2.138.

Pro spuštění programu z aktuálního pracovního adresáře je nutné před jeho název uvést „./“, aby Bash věděl, kde jej má hledat.

Aby bylo možné program spouštět z libovolného adresáře, přesuneme jeho spustitelný soubor do adresáře /usr/bin. Bash jej pak najde v cestě a spustí jej.

Není nutné mít soubor v aktuálním adresáři ani uvádět před jeho jméno „./“, jak je vidět v následujícím příkladu:

sudo mv htg /usr/bin

Nyní se pokusíme program spustit pouze zadáním:

htg

Spustil se sice program, ale nejedná se o naši novou aktualizovanou verzi. Byla spuštěna starší verze 1.2.105.

Použití příkazu which

Problém, který jsme popsali, je důvodem, proč byl vytvořen příkaz which .

V následujícím příkladu použijeme příkaz which s parametrem názvu programu, který chceme zkoumat:

which htg

Příkaz which nám oznámí, že nalezl verzi programu htg v adresáři /usr/local/bin. Protože se toto umístění v cestě objevuje před adresářem, do kterého jsme přesunuli aktualizovanou verzi, Bash používá dřívější verzi programu.

Pokud však použijeme volbu -a (all), která pokračuje v hledání i po nalezení shody:

which -a htg

Příkaz vypíše všechny shody v adresářích, které se nachází v cestě.

Takže toto je ten problém – ve složce, která je také v cestě, se nachází starší verze programu. Tato složka je prohledávána dříve než ta, do které jsme umístili novou verzi.

Pro ověření můžeme zadat následující příkazy, které explicitně spustí každou verzi programu:

/usr/local/bin/htg
/usr/bin/htg

Tím je problém objasněn a řešení je jednoduché.

Máme několik možností. Buď odstraníme starou verzi v /usr/local/bin, nebo ji přesuneme z /usr/bin do /usr/local/bin.

Analýza výsledků příkazu which

Dva výsledky nemusí nutně znamenat existenci dvou fyzických binárních souborů.

Podívejme se na příklad, kdy použijeme příkaz which s volbou -a (all) a budeme hledat verze programu less:

which -a less

Příkaz which vypíše dvě umístění, kde se má nacházet verze programu less. Je to ale skutečnost? Bylo by zvláštní mít na Linuxu dvě různé verze programu less (nebo stejnou verzi na více místech). Výstup z příkazu which tedy nebudeme brát jako bernou minci. Podíváme se na to zblízka.

Pomocí voleb ls -l (dlouhý výpis) a -h (čitelný pro člověka) zjistíme, co se děje:

ls -lh /usr/bin/less

Velikost souboru je pouhých devět bajtů! To rozhodně není kompletní kopie programu less.

První znak výpisu je „l“. Normální soubor by měl na tomto místě pomlčku „-„. „l“ je symbol pro symbolický odkaz. Pokud jste tento detail přehlédli, symbol –> také naznačuje, že se jedná o symbolický odkaz, což si můžeme představit jako jakousi zkratku. Tento odkaz směřuje na kopii programu less v adresáři /bin.

Zkusme to znovu s verzí less v /bin:

ls -lh /bin/less

Tento záznam je zřejmě skutečný binární spustitelný soubor. První znak výpisu je pomlčka (-), což znamená, že se jedná o běžný soubor a velikost souboru je 167 KB. Je tedy nainstalovaná pouze jedna kopie programu less, ale existuje na ni symbolický odkaz z jiného adresáře, který Bash také nalezne při prohledávání cesty.

Kontrola více příkazů najednou

Můžete příkazu which předat více programů a příkazů, které se budou kontrolovat v daném pořadí.

Například, pokud zadáte:

which ping cat uptime date head

Příkaz which zpracuje seznam programů a příkazů, které jste mu předali, a vypíše výsledky pro každý z nich.

Který příkaz which používám?

Pokud chcete, můžete příkaz which použít i na sebe:

which which

Kromě zkoumání souborového systému Linuxu je nejužitečnější, když od příkazu nebo programu očekáváte nějaké chování, ale dostanete jiné.
V těchto případech můžete příkaz which použít k ověření, zda Bash spouští ten příkaz, který chcete použít.