Sådan bruger du hvilken kommando på Linux

Linux-kommandoen identificerer den eksekverbare binære fil, der starter, når du udsteder en kommando til skallen. Hvis du har forskellige versioner af det samme program på din computer, kan du bruge hvilken til at finde ud af, hvilken en shell skal bruge.

Binære og stier

Når du forsøger at køre et program eller en kommando fra terminalvinduet, vil skallen (normalt, Bash på moderne distributioner) skal finde den kommando og starte den. Nogle kommandoer, som f.eks cd, historie, og pwd, er indbygget i skallen, så Bash ikke skal arbejde for hårdt for at finde disse.

Men hvordan finder Bash andre kommandoer, programmer og eksterne selvstændige binære filer? Nå, Bash bruger stien, som faktisk er en samling stier, som hver især peger på en mappe. Den søger derefter i hver af disse mapper efter en eksekverbar fil, der matcher den kommando eller det program, du prøver at køre. Når den finder en, starter Bash den og opgiver søgningen.

Du kan bruge echo til at kontrollere $PATH miljøvariablen og se mapperne i din sti. For at gøre det skal du skrive følgende og derefter trykke på Enter:

echo $PATH

Det

Outputlisten adskiller hver sti med koloner (:). På den computer, vi bruger, vil Bash søge i følgende mapper i denne rækkefølge:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/beholder
/bruger/spil
/usr/local/spil
/snap/bin

  Sådan formateres en USB-enhed til Fat32 på Linux

Der er mange mapper kaldet /sbin og /bin i filsystemet, hvilket kan føre til en vis forvirring.

Se disse veje

Lad os sige, at vi har en opdateret version af et program kaldet htg. Det er i vores nuværende mappe, og vi kan køre det ved at skrive følgende kommando:

./htg

Det

Det er ikke meget af et program – det udskriver bare versionsnummeret og lukker derefter ned. Den nye version er 1.2.138.

For at køre et program i den aktuelle arbejdsmappe skal du skrive “./” foran programnavnet, så Bash ved, hvor det skal findes.

Fordi vi ønsker at køre dette særlige program fra en hvilken som helst mappe, flytter vi den eksekverbare til mappen /usr/bin. Bash vil finde det program i stien og køre det for os.

Vi har ikke brug for den eksekverbare i vores nuværende mappe, og vi behøver heller ikke at skrive “./” foran programnavnet, som vist nedenfor:

sudo mv htg /usr/bin

Det

Lad os nu prøve at køre programmet ved at skrive:

htg

Det

Noget kører, men det er ikke vores nye, opdaterede program. Det er snarere den ældre version, 1.2.105.

Hvilken kommando

Problemet, vi demonstrerede ovenfor, er, hvorfor hvilken kommando blev designet.

I dette eksempel bruger vi hvilken og sender navnet på det program, vi undersøger, som en kommandolinjeparameter:

which htg

Det

som rapporterer, at den har fundet en version af htg i mappen /usr/local/bin. Fordi den placering vises i stien før den mappe, som vi flyttede den opdaterede htg til, bruger Bash den tidligere version af programmet.

  Sådan kontrolleres Linux-kernen og operativsystemversionen

Men hvis vi bruger muligheden -a (alle) som vist nedenfor, som fortsætter med at søge, selvom den finder et match:

which -a htg

Det

Det viser derefter alle matchene i enhver af mapperne i stien.

Så det er problemet – der er en tidligere version af programmet i en mappe, der også er i patchen. Og den mappe bliver søgt før den mappe, hvor vi droppede den nye version af programmet.

For at bekræfte kan vi skrive følgende og eksplicit køre hver version af programmet:

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

Dette forklarer problemet, og løsningen er enkel.

Faktisk har vi muligheder. Vi kan enten slette den gamle version i mappen /use/local/bin eller flytte den fra /usr/bin til /usr/local/bin.

Se disse resultater

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

Lad os se på et eksempel, hvor vi vil bruge hvilken-kommandoen med -a (alle)-indstillingen og se efter versioner af det mindre program:

which -a less

Det

som rapporterer to steder, der rummer en version af det mindre program, men er det sandt? Det ville være mærkeligt at have to forskellige versioner (eller den samme version flere steder) eller mindre installeret på en Linux-computer. Så vi vil ikke acceptere det output, hvorfra. Lad os i stedet grave lidt dybere.

Vi kan bruge mulighederne ls, -l (lang liste) og -h (læselig for mennesker) til at se, hvad der foregår:

ls -lh /usr/bin/less

Det

Filstørrelsen er rapporteret som ni bytes! Det er bestemt ikke en fuld kopi af mindre.

  Sådan bruges og installeres Snap-pakker på Linux

Det første tegn i fortegnelsen er et “l.” En normal fil ville have en bindestreg (-) som det første tegn. “l”et er et symbol, der betyder symbolsk link. Hvis du gik glip af den detalje, indikerer –> symbolet også, at dette er en symbolsk link, som du kan tænke på som en slags genvej. Denne peger på kopien af ​​mindre i /bin.

Lad os prøve igen med versionen af ​​mindre i /bin:

ls -lh /bin/less

Det

Denne post er åbenbart en “rigtig” binær eksekverbar. Det første tegn i listen er en bindestreg (-), hvilket betyder, at det er en almindelig fil, og filstørrelsen er 167 KB. Så kun én kopi af mindre er installeret, men der er et symbolsk link til den fra en anden mappe, som Bash også finder, når den søger på stien.

Kontrol af flere kommandoer på én gang

Du kan sende flere programmer og kommandoer til hvilke, og det vil kontrollere dem i rækkefølge.

Hvis du f.eks. skriver:

which ping cat uptime date head

Det

som arbejder gennem listen over programmer og kommandoer, du har leveret den med, og viser resultatet for hver enkelt.

Hvilken hvilken er hvilken?

Hvis du er så tilbøjelig, kan du også bruge hvilken på sig selv ved at skrive følgende:

which which

Bortset fra at søge rundt i Linux-filsystemet af nysgerrighed, hvilket er mest nyttigt, når du forventer et sæt adfærd fra en kommando eller et program, men får et andet.

Du kan bruge hvilken i disse tilfælde til at bekræfte, at kommandoen Bash starter er den, du vil bruge.