$PATH
is een van de stille manipulatoren op de achtergrond van je Linux-computer. Het beïnvloedt stilletjes uw gebruikerservaring, maar er is niets duister aan. We leggen uit wat het doet en hoe u het kunt aanpassen.
Wat is $ PATH op Linux en hoe werkt het?
Wanneer je een commando in een terminalvenster typt en op Enter drukt, start je behoorlijk wat activiteit voordat je commando zelfs maar wordt uitgevoerd.
Bash is de standaardshell op de meeste Linux-distributies. Het interpreteert de regel tekst die u hebt ingevoerd en identificeert de opdrachtnamen vermengd met de parameters, leidingen, omleidingen en al het andere. Het lokaliseert vervolgens de uitvoerbare binaire bestanden voor die opdrachten en start ze met de door u opgegeven parameters.
De eerste stap die de shell neemt om het uitvoerbare bestand te lokaliseren, is het identificeren of er überhaupt een binair bestand bij betrokken is. Als het commando dat u gebruikt zich in de shell zelf bevindt (een “ingebouwde shell”), is verder zoeken niet nodig.
Shell-builtins zijn het gemakkelijkst te vinden omdat ze een integraal onderdeel zijn van de shell. Het is alsof je ze in een gereedschapsriem hebt – ze zijn altijd bij je.
Als je echter een van je andere gereedschappen nodig hebt, moet je in de werkplaats gaan snuffelen om het te vinden. Staat het op je werkbank of op een muurhanger? Dat is wat de $PATH
omgevingsvariabele doet. Het bevat een lijst met plaatsen waar de shell zoekt en de volgorde waarin ze zullen worden doorzocht.
Als je wilt zien of een commando een ingebouwde shell, een alias, een functie of een standalone binaire mv / work / unfile is, kun je de type
commando zoals hieronder getoond:
type clear
type cd
Dit vertelt ons dat clear
is een binair bestand en het eerste dat in het pad wordt gevonden, bevindt zich op /usr/bin
. Mogelijk hebt u meer dan één versie van clear
geïnstalleerd op uw computer, maar dit is degene die de shell zal proberen te gebruiken.
Niet verrassend, cd
is een shell ingebouwd.
Uw $ PATH vermelden
Het is gemakkelijk om te zien wat er op je pad komt. Typ gewoon het volgende om het echo
commando en print de waarde in het $PATH
variabele:
echo $PATH
De uitvoer is een lijst met dubbele punten (:
) gescheiden bestandssysteemlocaties. De shell zoekt van links naar rechts door het pad en controleert elke bestandssysteemlocatie op een overeenkomend uitvoerbaar bestand om uw opdracht uit te voeren.
We kunnen onze weg door de lijst kiezen om de locaties van het bestandssysteem te zien die zullen worden doorzocht, en de volgorde waarin ze zullen worden doorzocht:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
Iets dat misschien niet meteen duidelijk is, is dat de zoekopdracht niet start in de huidige werkdirectory. Het werkt eerder door de vermelde mappen en alleen de vermelde mappen.
Als de huidige werkmap zich niet in uw pad bevindt, wordt deze niet doorzocht. Als je commando’s hebt opgeslagen in mappen die niet in het pad staan, zal de shell ze niet vinden.
Om dit te demonstreren hebben we een klein programma gemaakt met de naam rf
. Wanneer uitgevoerd, rf
drukt de naam af van de directory van waaruit het werd gestart in het terminalvenster. Het bevindt zich in /usr/local/bin
. We hebben ook een nieuwere versie in de /dave/work
directory.
We typen het volgende which
commando om ons te laten zien welke versie van ons programma de shell zal vinden en gebruiken:
which rf
De shell meldt dat de gevonden versie de versie is in de directory in het pad.
We typen het volgende om het op te starten:
rf
Versie 1.0 van rf
loopt en bevestigt dat onze verwachtingen juist waren. De gevonden en uitgevoerde versie bevindt zich in /usr/local/bin
.
Om een andere versie van rf
op deze computer moeten we het pad naar het uitvoerbare bestand op de opdrachtregel gebruiken, zoals hieronder weergegeven:
./work/rf
Nu we de shell hebben verteld waar de versie van rf
we willen draaien, het gebruikt versie 1.1. Als we de voorkeur geven aan deze versie, kunnen we deze kopiëren naar het /usr/local/bin
directory en overschrijf de oude.
Laten we zeggen dat we een nieuwe versie van rf
. We zullen het regelmatig moeten uitvoeren terwijl we het ontwikkelen en testen, maar we willen geen niet-vrijgegeven ontwikkeling naar de live-omgeving kopiëren.
Of misschien hebben we een nieuwe versie van rf
en willen er wat verificatietests op doen voordat we het openbaar maken.
Als we onze werkdirectory aan het pad toevoegen, zorgen we ervoor dat de shell onze versie vindt. En deze verandering heeft alleen invloed op ons – anderen zullen nog steeds de versie van gebruiken rf
in /usr/local/bin
.
Een directory aan uw $ PATH toevoegen
U kunt de export
opdracht om een map toe te voegen aan het $PATH
. De directory wordt vervolgens opgenomen in de lijst met bestandssysteemlocaties die de shell doorzoekt. Wanneer de shell een passend uitvoerbaar bestand vindt, stopt het met zoeken, dus u wilt er zeker van zijn dat het eerst in uw directory doorzoekt, voordat /usr/local/bin
.
Dit is gemakkelijk te doen. Voor ons voorbeeld typen we het volgende om onze directory aan het begin van het pad toe te voegen, zodat dit de eerste locatie is die wordt doorzocht:
export PATH=/home/dave/work:$PATH
Dit commando stelt $PATH
gelijk zijn aan de directory die we toevoegen, /home/dave/work
, en vervolgens het volledige huidige pad.
De eerste PATH
heeft geen dollarteken ($
). We stellen de waarde in voor PATH
. De laatste $PATH
heeft een dollarteken omdat we verwijzen naar de inhoud die is opgeslagen in het PATH
variabele. Let ook op de dubbele punt (:
) tussen de nieuwe directory en het $PATH
variabele naam.
Laten we eens kijken hoe het pad er nu uitziet:
echo $PATH
Onze /home/dave/work
directory wordt aan het begin van het pad toegevoegd. De dubbele punt die we hebben opgegeven, scheidt het van de rest van het pad.
We typen het volgende om onze versie van rf
is de eerste gevonden:
which rf
Het bewijs in de pudding loopt rf
, zoals hieronder weergegeven:
rf
De shell vindt versie 1.1 en voert het uit vanaf /home/dave/work
.
Om onze directory aan het einde van het pad toe te voegen, verplaatsen we deze gewoon naar het einde van het commando, als volgt:
export PATH=$PATH:/home/dave/work
De veranderingen permanent maken
Zoals Beth Brooke-Marciniak zei: “Succes is prima, maar succes is vluchtig.” Op het moment dat u het terminalvenster sluit, worden alle wijzigingen die u in het $PATH
zijn weg. Om ze permanent te maken, moet je je export
commando in een configuratiebestand.
Wanneer je de export
commando in je .bashrc
bestand, stelt het het pad in elke keer dat u een terminalvenster opent. in tegenstelling tot SSH
sessies, waarvoor u moet inloggen, worden “interactieve” sessies genoemd.
In het verleden zou u de export
commando in je .profile
bestand om het pad voor inlogterminalsessies in te stellen.
We ontdekten echter dat als we de export
commando in ofwel het .bashrc
of .profile
bestanden, heeft het het pad correct ingesteld voor zowel interactieve als inlogterminalsessies. Uw ervaring kan anders zijn. Om alle eventualiteiten af te handelen, laten we u zien hoe u dit in beide bestanden moet doen.
Gebruik de volgende opdracht in uw /home
directory om het .bashrc
het dossier:
gedit .bashrc
De gedit
editor wordt geopend met de .bashrc
bestand geladen.
Blader naar de onderkant van het bestand en voeg vervolgens de volgende exportopdracht toe die we eerder hebben gebruikt:
export PATH=/home/dave/work:$PATH
Sla het bestand op. Sluit vervolgens het terminalvenster en open het opnieuw of gebruik de dot
commando om het .bashrc
bestand, als volgt:
. .bashrc
Typ vervolgens het volgende echo
commando om het pad te controleren:
echo $PATH
Dit voegt de /home/dave/work
directory naar het begin van het pad.
Het proces om de opdracht toe te voegen aan het .profile
bestand is hetzelfde. Typ de volgende opdracht:
gedit .profile
De gedit
editor wordt gestart met de .profile
bestand geladen.
Voeg het export
opdracht onderaan het bestand en sla het vervolgens op. Het sluiten en openen van een nieuw terminalvenster is onvoldoende om het .profile
bestand dat opnieuw moet worden gelezen. Om de nieuwe instellingen van kracht te laten worden, moet u zich afmelden en weer aanmelden of de dot
commando zoals hieronder getoond:
. .profile
VERWANT: Tekstbestanden grafisch bewerken op Linux met gedit
De weg banen voor iedereen
Om het pad in te stellen voor iedereen die het systeem gebruikt, kunt u het /etc/profile
het dossier.
U moet sudo
, als volgt:
sudo gedit /etc/profile
Wanneer de gedit
editor wordt gestart, voegt u de exportopdracht toe aan de onderkant van het bestand.
Sla het bestand op en sluit het. De wijzigingen worden van kracht voor anderen de volgende keer dat ze inloggen.
Een opmerking over beveiliging
Zorg ervoor dat u niet per ongeluk een dubbele punt toevoegt ‘:
”Naar het pad, zoals hieronder weergegeven.
Als u dit doet, wordt eerst in de huidige directory gezocht, wat een beveiligingsrisico inhoudt. Stel dat u een archiefbestand heeft gedownload en het in een map heeft uitgepakt. Je kijkt naar de bestanden en ziet een ander gezipt bestand. Je roept nogmaals unzip om dat archief uit te pakken.
Als het eerste archief een uitvoerbaar bestand bevatte met de naam unzip
dat een kwaadaardig uitvoerbaar bestand was, zou je dat per ongeluk activeren in plaats van het echte unzip
uitvoerbaar. Dit zou gebeuren omdat de shell eerst in de huidige directory zou zoeken.
Wees dus altijd voorzichtig wanneer u uw export
commando’s. Gebruik echo
$ PATH om ze te beoordelen en ervoor te zorgen dat ze zijn zoals u wilt dat ze zijn.