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
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 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
Laten we nu proberen het programma uit te voeren door te typen:
htg
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
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
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
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
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
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
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
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.