Förstå kommandot ’which’ i Linux
I Linux används kommandot which
för att lokalisera den körbara fil som startas när du anger ett kommando i terminalen. Det är särskilt användbart om du har flera versioner av samma program installerade, eftersom det hjälper dig att se vilken version som faktiskt används av systemet.
Binärfiler och Sökvägar
När du försöker köra ett program eller kommando via terminalen, måste systemets skal (ofta Bash i moderna distributioner) först hitta kommandot och sedan starta det. Vissa grundläggande kommandon, som cd, history, och pwd, är inbyggda i skalet. Det betyder att Bash inte behöver leta upp dem i filsystemet.
För andra kommandon och program som är fristående binärfiler, använder Bash en sökväg. Den här sökvägen är i själva verket en lista över kataloger. Bash söker igenom varje katalog i listan efter en körbar fil med samma namn som det kommando du angett. Så snart en matchning hittas, startas den filen och sökningen avbryts.
Du kan se de kataloger som ingår i din systems sökväg med hjälp av kommandot echo $PATH
. Genom att skriva detta i terminalen får du en lista över sökvägar separerade med kolon (:). Till exempel kan en typisk sökväg se ut så här:
echo $PATH
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games:
/snap/bin
Observera att det kan finnas flera mappar som heter /sbin och /bin i filsystemet, vilket ibland kan leda till förvirring.
Inspektera Sökvägar i Praktiken
Tänk dig att vi har en uppdaterad version av ett program som heter ’htg’. Denna version finns i vår nuvarande arbetskatalog och vi kan köra den genom att skriva ./htg
i terminalen.
Programmet skriver ut versionsnumret (1.2.138) och avslutas. För att kunna köra ett program i den nuvarande katalogen måste du ange ’./’ framför programnamnet.
För att kunna köra programmet från vilken katalog som helst, väljer vi att flytta den körbara filen till /usr/bin
. Genom att göra detta kommer Bash att hitta programmet i sökvägen.
Efter flytten behöver vi inte längre ange ./
. Vi kan nu köra programmet genom att skriva htg
i terminalen. För att flytta filen använder vi följande kommando:
sudo mv htg /usr/bin
Men när vi nu kör htg
ser vi att en äldre version (1.2.105) startar. Något körs, men det är inte den uppdaterade versionen.
htg
Användning av kommandot ’which’
Detta är anledningen till att kommandot which
finns. Kommandot hjälper dig att lista ut vilken sökväg som Bash använder för att hitta binärfilerna.
Kommandot är designat för att lösa just den här typen av problem.
Vi kan använda which
genom att ange programnamnet som en parameter. Till exempel:
which htg
I det här fallet visar which
att en version av ’htg’ finns i /usr/local/bin
. Denna plats kommer före /usr/bin
i sökvägen, vilket innebär att Bash använder den äldre versionen av programmet.
Om vi istället använder alternativet -a
(alla) kommer which
att fortsätta söka efter matchningar, även om en redan har hittats:
which -a htg
Nu ser vi att båda platserna med programmet ’htg’ listas. Problemet är uppenbart: en äldre version av programmet finns i en katalog som är prioriterad i systemets sökväg.
För att bekräfta detta kan vi köra varje version av programmet explicit:
/usr/local/bin/htg
/usr/bin/htg
Lösningen är enkel: vi kan antingen ta bort den gamla versionen från /usr/local/bin
eller flytta den nya versionen från /usr/bin
till /usr/local/bin
.
Inte Alltid Två Filer
Ibland kan två resultat innebära något annat än två faktiska binärfiler. Låt oss ta programmet ’less’ som exempel. Om vi söker med which -a less
får vi två träffar:
which -a less
Det kan verka konstigt att ha två olika versioner av ’less’ installerade. Men om vi granskar filerna närmare med hjälp av ls -lh
ser vi att det ligger till på ett annat sätt.
ls -lh /usr/bin/less
Filstorleken här är bara 9 byte, vilket är misstänksamt lite. Det första tecknet i listan är ’l’, vilket indikerar en symbolisk länk. Symbolen –> bekräftar också detta. Denna länk pekar till en riktig kopia av ’less’ i /bin
.
Låt oss undersöka filen i /bin
:
ls -lh /bin/less
Denna post visar en riktig binärfil. Det första tecknet är ett bindestreck (-), och filstorleken är 167 KB. Så det finns egentligen bara en version av ’less’ installerad, men det finns en symbolisk länk till den från en annan katalog.
Kontrollera Flera Kommandon
Which
kan också kontrollera flera kommandon samtidigt:
which ping cat uptime date head
Kommandot arbetar igenom listan och ger resultatet för varje kommando.
’which’ på ’which’
Det är möjligt att använda which
på sig självt:
which which
Förutom att undersöka filsystemet av ren nyfikenhet, är ’which’ mest användbart när du förväntar dig ett visst beteende från ett program, men får något annat. I dessa fall kan which
hjälpa dig att verifiera att rätt binärfil faktiskt startas.