Příkaz Linux, který identifikuje spustitelný binární soubor, který se spustí, když zadáte příkaz do shellu. Pokud máte v počítači různé verze stejného programu, můžete pomocí které zjistit, kterou z nich bude shell používat.
Table of Contents
Binární soubory a cesty
Když se pokusíte spustit program nebo příkaz z okna terminálu, shell (obvykle Bash na moderních distribucích) musí tento příkaz najít a spustit. Některé příkazy, jako např CD, Dějiny, a pwd, jsou zabudovány do shellu, takže Bash nemusí příliš pracně je najít.
Jak ale Bash najde další příkazy, programy a externí samostatné binární soubory? Bash používá cestu, což je vlastně sbírka cest, z nichž každá ukazuje na adresář. Potom v každém z těchto adresářů vyhledá spustitelný soubor, který odpovídá příkazu nebo programu, který se pokoušíte spustit. Když nějakou najde, Bash ji spustí a zanechá hledání.
Pomocí echo můžete zkontrolovat proměnnou prostředí $PATH a zobrazit adresáře ve vaší cestě. Chcete-li tak učinit, zadejte následující a stiskněte Enter:
echo $PATH
Výstupní seznam odděluje každou cestu dvojtečkami (:). Na počítači, který používáme, Bash prohledá následující adresáře v tomto pořadí:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/zásobník
/uživatel/hry
/usr/local/games
/snap/bin
V systému souborů je mnoho složek nazvaných /sbin a /bin, což může vést k určitému zmatku.
Podívejte se na ty cesty
Řekněme, že máme aktualizovanou verzi programu s názvem htg. Je v našem aktuálním adresáři a můžeme jej spustit zadáním následujícího příkazu:
./htg
Není to moc program – jen vytiskne číslo verze a pak se zavře. Nová verze je 1.2.138.
Chcete-li spustit program v aktuálním pracovním adresáři, musíte před název programu napsat „./“, aby Bash věděl, kde jej najít.
Protože chceme tento konkrétní program spouštět z libovolného adresáře, přesuneme spustitelný soubor do adresáře /usr/bin. Bash najde tento program v cestě a spustí ho za nás.
Nepotřebujeme spustitelný soubor v našem aktuálním adresáři, ani nemusíme psát „./“ před název programu, jak je uvedeno níže:
sudo mv htg /usr/bin
Nyní se pokusíme spustit program zadáním:
htg
Něco běží, ale není to náš nový, aktualizovaný program. Spíše je to starší verze, 1.2.105.
Příkaz který
Problém, který jsme demonstrovali výše, je, proč příkaz which byl navržen.
V tomto příkladu použijeme který a předáme název programu, který zkoumáme, jako parametr příkazového řádku:
which htg
který hlásí, že nalezl verzi htg v adresáři /usr/local/bin. Protože se toto umístění objevuje v cestě před adresářem, do kterého jsme přesunuli aktualizované htg, používá Bash dřívější verzi programu.
Pokud však použijeme volbu -a (all), jak je uvedeno níže, která pokračuje v hledání, i když najde shodu:
which -a htg
Poté vypíše všechny shody v libovolném z adresářů v cestě.
Takže to je ten problém – v adresáři, který je také v patchi, je starší verze programu. A tento adresář se prohledává před adresářem, do kterého jsme upustili novou verzi programu.
Pro ověření můžeme napsat následující a explicitně spustit každou verzi programu:
/usr/local/bin/htg
/usr/bin/htg
To vysvětluje problém a řešení je jednoduché.
Ve skutečnosti máme možnosti. Starou verzi můžeme buď smazat v adresáři /use/local/bin, nebo ji přesunout z /usr/bin do /usr/local/bin.
Podívejte se na ty výsledky
Dva výsledky nemusí nutně znamenat dva binární soubory.
Podívejme se na příklad, ve kterém použijeme příkaz which s volbou -a (all) a hledáme verze programu less:
which -a less
který hlásí dvě umístění, kde je umístěna verze méně programu, ale je to pravda? Bylo by zvláštní mít na počítači se systémem Linux dvě různé verze (nebo stejnou verzi na více místech) nebo méně. Takže nebudeme akceptovat výstup, ze kterého. Místo toho pojďme kopat trochu hlouběji.
Můžeme použít volby ls, -l (dlouhý výpis) a -h (čitelný pro člověka), abychom viděli, co se děje:
ls -lh /usr/bin/less
Velikost souboru je hlášena jako devět bajtů! To rozhodně není úplná kopie méně.
První znak výpisu je „l“. Normální soubor by měl jako první znak spojovník (-). „l“ je symbol, který znamená symbolický odkaz. Pokud jste tento detail přehlédli, symbol –> také označuje, že se jedná o a symbolický odkaz, což si můžete představit jako určitou zkratku. Tento ukazuje na kopii less v /bin.
Zkusme to znovu s verzí less v /bin:
ls -lh /bin/less
Tento záznam je zjevně „skutečný“ binární spustitelný soubor. Prvním znakem výpisu je pomlčka (-), což znamená, že se jedná o běžný soubor a velikost souboru je 167 KB. Je tedy nainstalována pouze jedna kopie z méně, ale je na ni symbolický odkaz z jiného adresáře, který Bash také najde, když prohledává cestu.
Kontrola více příkazů najednou
Můžete jim předat více programů a příkazů a bude je kontrolovat v pořadí.
Pokud například zadáte:
which ping cat uptime date head
který pracuje se seznamem programů a příkazů, které jste mu dodali, a uvádí výsledky pro každý z nich.
Která která je která?
Pokud jste tak nakloněni, můžete také použít který na sebe zadáním následujícího:
which which
Nehledě na to, že ze zvědavosti šťoucháte v souborovém systému Linuxu, což je nejužitečnější, když od příkazu nebo programu očekáváte jednu sadu chování, ale dostanete jinou.
V těchto případech můžete použít k ověření toho, že příkaz Bash spouští, je ten, který chcete použít.