Hoe de welke opdracht op Linux te gebruiken

Een terminalvenster dat draait op een Linux-laptopcomputer.
Fatmawati Achmad Zaenuri / Shutterstock

Het Linux which commando identificeert het uitvoerbare binaire bestand dat wordt gestart wanneer u een commando naar de shell geeft. Als u verschillende versies van hetzelfde programma op uw computer heeft, kunt u which om erachter te komen welke de shell zal gebruiken.

Binaire bestanden en paden

Wanneer je een programma of commando vanuit het terminalvenster probeert uit te voeren, moet de shell (meestal Bash op moderne distributies) dat commando vinden en het starten. Sommige commando’s, zoals cd, history en pwd, zijn in de shell ingebouwd, dus Bash hoeft niet al te hard te werken om deze te vinden.

Maar hoe lokaliseert Bash andere commando’s, programma’s en externe zelfstandige binaire bestanden? Welnu, Bash gebruikt het pad, dat eigenlijk een verzameling paden is, die elk naar een map verwijzen. Vervolgens wordt in elk van die mappen gezocht naar een uitvoerbaar bestand dat overeenkomt met de opdracht of het programma dat u probeert uit te voeren. Als het er een vindt, lanceert Bash het en stopt met zoeken.

Je kunt gebruiken echo om het $PATH omgevingsvariabele en bekijk de mappen in uw pad. Typ hiervoor het volgende en druk op Enter:

echo $PATH

Het "echo $ PATH" commando in een terminalvenster.

De uitvoerlijst scheidt elk pad met dubbele punten (:). Op de computer die we gebruiken, doorzoekt Bash de volgende mappen in deze volgorde:

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /user/games
  • /usr/local/games
  • /snap/bin

Er worden veel mappen genoemd /sbin en /bin in het bestandssysteem, wat tot enige verwarring kan leiden.

Bekijk die paden

Laten we zeggen dat we een bijgewerkte versie hebben van een programma met de naam htg. Het staat in onze huidige directory en we kunnen het uitvoeren door de volgende opdracht te typen:

./htg 

Het "./htg" commando in een terminalvenster.

Het is niet echt een programma – het drukt alleen het versienummer af en wordt dan afgesloten. De nieuwe versie is 1.2.138.

Om een ​​programma in de huidige werkdirectory te draaien, moet je “./” voor de programmanaam typen, zodat Bash weet waar het te vinden is.

Omdat we dit specifieke programma vanuit elke map willen uitvoeren, gaan we het uitvoerbare bestand naar het /usr/bin directory. Bash zal dat programma in het pad vinden en het voor ons uitvoeren.

We hebben het uitvoerbare bestand in onze huidige directory niet nodig, noch hoeven we “./” voor de programmanaam in te typen, zoals hieronder wordt weergegeven:

sudo mv htg /usr/bin

Het "sudo mv htg / usr / bin" commando in een terminalvenster.

Laten we nu proberen het programma uit te voeren door te typen:

htg

Het "htg" -commando in een terminalvenster.

Er loopt iets, maar het is niet ons nieuwe, bijgewerkte programma. Het is eerder de oudere versie, 1.2.105.

Het welke commando

Het probleem dat we hierboven hebben aangetoond, is waarom het which commando is ontworpen.

In dit voorbeeld gebruiken we which en geef de naam van het programma dat we onderzoeken door als een opdrachtregelparameter:

which htg

De "which htg" -opdracht in een terminalvenster.

which meldt dat er een versie van is gevonden htg in de /usr/local/bin directory. Omdat die locatie wordt weergegeven in het pad vóór de map waarnaar we het bijgewerkte htg, Bash gebruikt die eerdere versie van het programma.

Als we echter de -a (alle) optie zoals hieronder getoond, which blijft zoeken, zelfs als het een overeenkomst vindt:

which -a htg

Het "which -a htg" commando in een terminalvenster.

Vervolgens worden alle overeenkomsten in een van de mappen in het pad weergegeven.

Dus dat is het probleem – er is een eerdere versie van het programma in een directory die ook in de patch staat. En die map wordt doorzocht vóór de map waarin we de nieuwe versie van het programma hebben neergezet.

Om dit te verifiëren, kunnen we het volgende typen en expliciet elke versie van het programma uitvoeren:

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

"/ usr / local / bin / htg" commando in een terminalvenster.

Dit verklaart het probleem en de oplossing is eenvoudig.

Eigenlijk hebben we opties. We kunnen de oude versie verwijderen in het /use/local/bin directory of verplaats het van /usr/bin naar /usr/local/bin.

Bekijk die resultaten

Twee resultaten betekenen niet noodzakelijk twee binaire bestanden.

Laten we eens kijken naar een voorbeeld waarin we de which commando met de -a (alle) optie en zoek naar versies van het less programma:

which -a less

Het "which -a less" -commando in een terminalvenster.

which meldt twee locaties met een versie van de less programma, maar is dat waar? Het zou vreemd zijn om twee verschillende versies (of dezelfde versie op meerdere locaties) van less geïnstalleerd op een Linux-computer. Dus we gaan de uitvoer van niet accepteren which. Laten we in plaats daarvan wat dieper graven.

We kunnen de ls, -l (lange lijst), en -h (door mensen leesbare) opties om te zien wat er aan de hand is:

ls -lh /usr/bin/less

Het "ls -lh / usr / bin / less" commando in een terminalvenster.

De bestandsgrootte wordt gerapporteerd als negen bytes! Dat is zeker geen volledige kopie van less.

Het eerste teken van de vermelding is een ‘l’. Een normaal bestand zou een koppelteken (-) als eerste teken hebben. De “l” is een symbool dat betekent symbolische link. Als je dat detail hebt gemist, is de --> symbool geeft ook aan dat dit een symbolische link is, die u kunt zien als een soort snelkoppeling. Deze verwijst naar de kopie van less in /bin.

Laten we het opnieuw proberen met de versie van less in /bin:

ls -lh /bin/less

Het "ls -lh / bin / less" commando in een terminalvenster.

Dit item is duidelijk een “echt” binair uitvoerbaar bestand. Het eerste teken van de lijst is een koppelteken (-), wat betekent dat het een normaal bestand is en dat de bestandsgrootte 167 KB is. Dus slechts één exemplaar van less is geïnstalleerd, maar er is een symbolische link naar vanuit een andere map, die Bash ook vindt wanneer het het pad doorzoekt.

VERWANT: Hoe de ls-opdracht te gebruiken om bestanden en mappen op Linux weer te geven

Meerdere opdrachten tegelijk controleren

U kunt meerdere programma’s en opdrachten doorgeven aan which, en het zal ze op volgorde controleren.

Als u bijvoorbeeld typt:

which ping cat uptime date head

Het "welke ping cat uptime date head" -opdracht in een terminalvenster.

which doorloopt de lijst met programma’s en opdrachten die u eraan hebt verstrekt en geeft het resultaat voor elk daarvan weer.

Welke welke is wat?

Als u zo geneigd bent, kunt u ook gebruiken which op zichzelf door het volgende te typen:

which which

Afgezien van het uit nieuwsgierigheid rondneuzen in het Linux-bestandssysteem, which is het handigst als u een bepaald gedrag verwacht van een commando of programma, maar een ander krijgt.

Je kunt gebruiken which in deze gevallen om te controleren of het commando dat Bash start, degene is die u wilt gebruiken.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in