Hvordan bruke hvilken kommando på Linux

Linux som-kommandoen identifiserer den kjørbare binære filen som starter når du utsteder en kommando til skallet. Hvis du har forskjellige versjoner av det samme programmet på datamaskinen, kan du bruke hvilken for å finne ut hvilken som skal brukes.

Binærer og stier

Når du prøver å kjøre et program eller en kommando fra terminalvinduet, vil skallet (vanligvis, Bash på moderne distribusjoner) må finne den kommandoen og starte den. Noen kommandoer, som f.eks cd, historieog pwder innebygd i skallet, så Bash trenger ikke å jobbe for hardt for å finne disse.

Men hvordan finner Bash andre kommandoer, programmer og eksterne frittstående binærfiler? Vel, Bash bruker banen, som faktisk er en samling stier, som hver peker til en katalog. Den søker deretter i hver av disse katalogene etter en kjørbar fil som samsvarer med kommandoen eller programmet du prøver å kjøre. Når den finner en, starter Bash den og forlater søket.

Du kan bruke ekko til å sjekke miljøvariabelen $PATH og se katalogene i banen din. For å gjøre det, skriv inn følgende, og trykk deretter Enter:

echo $PATH

De

Utdatalisten skiller hver bane med kolon (:). På datamaskinen vi bruker, vil Bash søke i følgende kataloger i denne rekkefølgen:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/bruker/spill
/usr/local/spill
/snap/bin

Det er mange mapper kalt /sbin og /bin i filsystemet, noe som kan føre til litt forvirring.

  Hvordan bruke Shazam på Linux-skrivebordet med SongRec

Se på disse stiene

La oss si at vi har en oppdatert versjon av et program som heter htg. Den er i vår nåværende katalog, og vi kan kjøre den ved å skrive inn følgende kommando:

./htg

De

Det er ikke mye av et program – det skriver bare ut versjonsnummeret og lukkes deretter. Den nye versjonen er 1.2.138.

For å kjøre et program i gjeldende arbeidskatalog, må du skrive «./» foran programnavnet, slik at Bash vet hvor du finner det.

Fordi vi ønsker å kjøre dette spesielle programmet fra en hvilken som helst katalog, kommer vi til å flytte den kjørbare filen inn i /usr/bin-katalogen. Bash vil finne det programmet i banen og kjøre det for oss.

Vi trenger ikke den kjørbare filen i vår nåværende katalog, og vi trenger heller ikke skrive «./» foran programnavnet, som vist nedenfor:

sudo mv htg /usr/bin

De

La oss nå prøve å kjøre programmet ved å skrive:

htg

De

Noe kjører, men det er ikke vårt nye, oppdaterte program. Snarere er det den eldre versjonen, 1.2.105.

Hvilken kommando

Problemet vi viste ovenfor er hvorfor hvilken kommando ble designet.

I dette eksemplet bruker vi hvilken og sender navnet på programmet vi undersøker som en kommandolinjeparameter:

which htg

De

som rapporterer at den har funnet en versjon av htg i katalogen /usr/local/bin. Fordi den plasseringen vises i banen før katalogen som vi flyttet den oppdaterte htg til, bruker Bash den tidligere versjonen av programmet.

  Slik bruker du fingerkommandoen på Linux

Men hvis vi bruker alternativet -a (alle) som vist nedenfor, som fortsetter å søke selv om det finner en match:

which -a htg

De

Den viser deretter alle treff i en av katalogene i banen.

Så det er problemet – det er en tidligere versjon av programmet i en katalog som også er i oppdateringen. Og den katalogen blir søkt før katalogen der vi droppet den nye versjonen av programmet.

For å bekrefte kan vi skrive inn følgende og eksplisitt kjøre hver versjon av programmet:

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

Dette forklarer problemet, og løsningen er enkel.

Faktisk har vi alternativer. Vi kan enten slette den gamle versjonen i /use/local/bin-katalogen eller flytte den fra /usr/bin til /usr/local/bin.

Se disse resultatene

To resultater betyr ikke nødvendigvis to binære filer.

La oss se på et eksempel der vi bruker hvilken-kommandoen med alternativet -a (alle) og ser etter versjoner av programmet mindre:

which -a less

De

som rapporterer to steder som inneholder en versjon av det mindre programmet, men er det sant? Det ville være rart å ha to forskjellige versjoner (eller samme versjon på flere steder) eller mindre installert på en Linux-datamaskin. Så vi kommer ikke til å godta utdataene som. La oss heller grave litt dypere.

Vi kan bruke alternativene ls, -l (lang liste) og -h (lesbare mennesker) for å se hva som skjer:

ls -lh /usr/bin/less

De

Filstørrelsen er rapportert som ni byte! Det er definitivt ikke en fullstendig kopi av mindre.

  Hvordan lese Hacker News på Linux-skrivebordet

Det første tegnet i oppføringen er en «l». En vanlig fil vil ha en bindestrek (-) som det første tegnet. «l» er et symbol som betyr symbolsk lenke. Hvis du gikk glipp av den detaljen, indikerer –>-symbolet også at dette er en symbolsk lenke, som du kan tenke på som en slags snarvei. Denne peker på kopien av mindre i /bin.

La oss prøve igjen med versjonen av mindre i /bin:

ls -lh /bin/less

De

Denne oppføringen er åpenbart en «ekte» binær kjørbar. Det første tegnet i oppføringen er en bindestrek (-), som betyr at det er en vanlig fil, og filstørrelsen er 167 KB. Så bare én kopi av mindre er installert, men det er en symbolsk lenke til den fra en annen katalog, som Bash også finner når den søker etter banen.

Sjekke flere kommandoer samtidig

Du kan sende flere programmer og kommandoer til hvilke, og den vil sjekke dem i rekkefølge.

Hvis du for eksempel skriver:

which ping cat uptime date head

De

som fungerer gjennom listen over programmer og kommandoer du ga den med og viser resultatet for hver enkelt.

Hvilken som er hvilken?

Hvis du er så tilbøyelig, kan du også bruke hvilken på seg selv ved å skrive følgende:

which which

Bortsett fra å rote rundt i Linux-filsystemet av nysgjerrighet, som er mest nyttig når du forventer ett sett med atferd fra en kommando eller et program, men får et annet.

Du kan bruke hvilken i disse tilfellene for å bekrefte at kommandoen Bash starter er den du vil bruke.