Hur man använder vilken kommando på Linux

Linux-kommandot som identifierar den körbara binära filen som startas när du utfärdar ett kommando till skalet. Om du har olika versioner av samma program på din dator kan du använda vilken för att ta reda på vilken skalet kommer att använda.

Binärer och vägar

När du försöker köra ett program eller kommando från terminalfönstret, kommer skalet (vanligtvis, Våldsamt slag på moderna distributioner) måste hitta det kommandot och starta det. Vissa kommandon, som t.ex CD, historiaoch pwdär inbyggda i skalet, så Bash behöver inte arbeta för hårt för att hitta dessa.

Men hur hittar Bash andra kommandon, program och externa fristående binärer? Tja, Bash använder sökvägen, som faktiskt är en samling sökvägar, som var och en pekar på en katalog. Den söker sedan i var och en av dessa kataloger efter en körbar fil som matchar kommandot eller programmet du försöker köra. När den hittar en startar Bash den och överger sökningen.

Du kan använda echo för att kontrollera miljövariabeln $PATH och se katalogerna i din väg. För att göra det, skriv följande och tryck sedan på Enter:

echo $PATH

De

Utdatalistan separerar varje sökväg med kolon (:). På datorn vi använder kommer Bash att söka i följande kataloger i denna ordning:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/användare/spel
/usr/local/spel
/snap/bin

Det finns många mappar som heter /sbin och /bin i filsystemet, vilket kan leda till viss förvirring.

Titta på dessa vägar

Låt oss säga att vi har en uppdaterad version av ett program som heter htg. Det finns i vår nuvarande katalog, och vi kan köra det genom att skriva följande kommando:

./htg

De

Det är inte mycket av ett program – det skriver bara ut versionsnumret och stängs sedan. Den nya versionen är 1.2.138.

För att köra ett program i den aktuella arbetskatalogen måste du skriva ”./” framför programnamnet, så att Bash vet var den kan hitta det.

Eftersom vi vill köra just detta program från vilken katalog som helst, kommer vi att flytta den körbara filen till katalogen /usr/bin. Bash hittar det programmet i sökvägen och kör det åt oss.

Vi behöver inte den körbara filen i vår nuvarande katalog, och vi behöver inte heller skriva ”./” framför programnamnet, som visas nedan:

sudo mv htg /usr/bin

De

Låt oss nu försöka köra programmet genom att skriva:

htg

De

Något körs, men det är inte vårt nya, uppdaterade program. Det är snarare den äldre versionen, 1.2.105.

Vilket kommando

Problemet vi visade ovan är varför vilket kommando var designad.

I det här exemplet använder vi vilken och skickar namnet på programmet vi undersöker som en kommandoradsparameter:

which htg

De

som rapporterar att det har hittats en version av htg i katalogen /usr/local/bin. Eftersom den platsen visas i sökvägen före katalogen som vi flyttade den uppdaterade htg till, använder Bash den tidigare versionen av programmet.

Men om vi använder alternativet -a (alla) som visas nedan, som fortsätter att söka även om det hittar en matchning:

which -a htg

De

Den listar sedan alla matchningar i någon av katalogerna i sökvägen.

Så det är problemet – det finns en tidigare version av programmet i en katalog som också finns i patchen. Och den katalogen genomsöks före katalogen där vi släppte den nya versionen av programmet.

För att verifiera kan vi skriva följande och uttryckligen köra varje version av programmet:

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

Detta förklarar problemet, och lösningen är enkel.

Egentligen har vi alternativ. Vi kan antingen ta bort den gamla versionen i katalogen /use/local/bin eller flytta den från /usr/bin till /usr/local/bin.

Se dessa resultat

Två resultat betyder inte nödvändigtvis två binära filer.

Låt oss titta på ett exempel där vi använder kommandot which med alternativet -a (alla) och letar efter versioner av programmet mindre:

which -a less

De

som rapporterar två platser som innehåller en version av programmet mindre, men är det sant? Det skulle vara konstigt att ha två olika versioner (eller samma version på flera platser) eller mindre installerade på en Linux-dator. Så vi kommer inte att acceptera utgången från vilken. Låt oss istället gräva lite djupare.

Vi kan använda alternativen ls, -l (lång lista) och -h (läsbar för människor) för att se vad som händer:

ls -lh /usr/bin/less

De

Filstorleken rapporteras som nio byte! Det är definitivt inte en fullständig kopia av mindre.

Det första tecknet i listan är ett ”l.” En normal fil skulle ha ett bindestreck (-) som första tecken. ”l” är en symbol som betyder symbolisk länk. Om du missade den detaljen indikerar symbolen –> också att detta är en symbolisk länk, som du kan tänka dig som en sorts genväg. Den här pekar på kopian av mindre i /bin.

Låt oss försöka igen med versionen av less i /bin:

ls -lh /bin/less

De

Den här posten är uppenbarligen en ”riktig” binär körbar fil. Det första tecknet i listan är ett bindestreck (-), vilket betyder att det är en vanlig fil och filstorleken är 167 KB. Så, bara en kopia av mindre är installerad, men det finns en symbolisk länk till den från en annan katalog, som Bash också hittar när den söker efter sökvägen.

Kontrollera flera kommandon samtidigt

Du kan skicka flera program och kommandon till vilka, och det kommer att kontrollera dem i ordning.

Om du till exempel skriver:

which ping cat uptime date head

De

som fungerar genom listan över program och kommandon du försåg den med och listar resultatet för var och en.

Vilken som är vilken?

Om du är så benägen kan du också använda vilken på sig själv genom att skriva följande:

which which

Förutom att leta runt i Linux-filsystemet av nyfikenhet, vilket är mest användbart när du förväntar dig en uppsättning beteenden från ett kommando eller program, men får en annan.

Du kan använda vilken i dessa fall för att verifiera att kommandot Bash startar är det du vill använda.