Hur man använder vilken kommando på Linux


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.