Förstå och Anpassa $PATH i Linux
Variabeln $PATH är en central, men ofta obemärkt, del av Linux-system. Den spelar en avgörande roll i hur din dator fungerar, även om den sällan kommer till ytan. Vi ska utforska dess funktioner och hur du kan ändra den efter dina behov.
Vad är $PATH och hur fungerar den?
Varje gång du skriver ett kommando i terminalen och trycker på Enter, påbörjas en hel del processer bakom kulisserna innan själva kommandot utförs.
Bash, det standardmässiga skalet i de flesta Linuxdistributioner, tar din textinmatning, analyserar den och identifierar kommandon, parametrar, pipes och omdirigeringar. Därefter letar den upp de binärfiler som motsvarar kommandona och kör dem med de angivna parametrarna.
I sin sökning efter binärfiler kontrollerar skalet först om kommandot är en inbyggd funktion. Inbyggda kommandon är integrerade direkt i skalet och kräver ingen ytterligare sökning. De är tillgängliga direkt, som verktyg i din verktygslåda.
Men om kommandot inte är inbyggt, behöver skalet en karta för att hitta det. Det är här miljövariabeln $PATH kommer in. Den fungerar som en lista över platser där skalet ska söka efter körbara filer, i en förutbestämd ordning.
För att ta reda på om ett kommando är inbyggt, ett alias, en funktion eller en separat binärfil, kan du använda kommandot type
:
type clear
type cd
Resultatet visar att clear
är en binärfil och att den första versionen som hittas ligger i /usr/bin
. Det kan finnas fler versioner installerade, men det är den här skalet använder. Kommandot cd
är däremot ett inbyggt skal-kommando.
Visa innehållet i din $PATH
Du kan enkelt se vilka sökvägar som ingår i din $PATH genom att använda kommandot echo
för att visa innehållet i variabeln:
echo $PATH
Utmatningen är en serie filsystemsplatser, separerade med kolon (:). Skalet går igenom listan från vänster till höger och söker i varje mapp efter en körbar fil som matchar ditt kommando.
Här är ett exempel på en typisk $PATH:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
En viktig detalj är att sökningen inte börjar i den aktuella mappen. Skalet letar enbart i de listade sökvägarna. Om den aktuella katalogen inte finns i $PATH, kommer inte kommandona att hittas. Samma sak gäller kommandon i mappar som inte är listade i sökvägen.
För att visa detta har vi skapat ett program som heter rf
. När det körs, skriver rf
ut namnet på katalogen det startades från. En version av rf
ligger i /usr/local/bin
och en nyare version i /dave/work
. Vi använder kommandot which
för att se vilken version skalet hittar:
which rf
Skalet visar att den hittade versionen finns i mappen som är listad i sökvägen.
Om vi kör kommandot rf
:
rf
Version 1.0 av rf
körs, vilket bekräftar att den hämtats från /usr/local/bin
.
För att köra en annan version av rf
behöver vi ange den fullständiga sökvägen direkt i kommandoraden:
./work/rf
Nu startar version 1.1. Om vi föredrar denna version kan vi kopiera den till /usr/local/bin
och skriva över den gamla.
Om vi utvecklar en ny version av rf
och behöver köra den ofta, kanske vi inte vill placera en outgiven version i live-miljön. Eller om vi har laddat ned en ny version och vill testa den innan den används officiellt.
Genom att lägga till vår arbetskatalog i $PATH kommer skalet att hitta vår version, samtidigt som andra användare fortsätter använda versionen i /usr/local/bin
.
Lägg till en mapp till din $PATH
Du kan lägga till en katalog till $PATH med kommandot export
. Katalogen läggs till listan över sökvägar som skalet letar igenom. Skalet slutar leta när det hittar en körbar fil, så du behöver se till att din katalog söks igenom först, före /usr/local/bin
.
För att lägga till vår arbetskatalog först i sökvägen, skriver vi följande:
export PATH=/home/dave/work:$PATH
Detta sätter $PATH till att vara lika med den nya mappen /home/dave/work
, följt av den befintliga sökvägen.
Den första PATH har inget dollartecken ($). Vi sätter värdet för PATH. Den andra $PATH
har ett dollartecken eftersom vi refererar till värdet som finns lagrat i variabeln PATH. Observera också kolonet (:) mellan den nya mappen och variabeln $PATH
.
Så här ser sökvägen ut nu:
echo $PATH
/home/dave/work
är nu lagt till i början av sökvägen.
Vi verifierar att vår version av rf
nu hittas först:
which rf
Och om vi kör rf
ser vi att den nya versionen körs:
rf
Skalet hittar version 1.1 och kör den från /home/dave/work
.
Om du vill lägga till mappen i slutet av sökvägen flyttar du den till slutet av kommandot:
export PATH=$PATH:/home/dave/work
Gör dina ändringar permanenta
Som Beth Brooke-Marciniak sa, ”Framgång är bra, men framgång är flyktig”. Dina ändringar i $PATH är tillfälliga och försvinner när du stänger terminalfönstret. För att göra ändringarna permanenta behöver du lägga till export
-kommandot i en konfigurationsfil.
Genom att lägga till export
-kommandot i filen .bashrc
, kommer sökvägen att uppdateras varje gång du öppnar ett terminalfönster. Dessa är så kallade ”interaktiva” sessioner, till skillnad från SSH-sessioner där du behöver logga in.
Tidigare lade man till kommandot export
i filen .profile
för att uppdatera sökvägen för terminalsessioner som krävde inloggning.
Vi har funnit att om vi lägger till export
-kommandot i antingen .bashrc
eller .profile
, så uppdateras sökvägen för både interaktiva och inloggade terminalsessioner. Din upplevelse kan vara annorlunda, därför visar vi hur du gör i båda filerna.
Använd följande kommando för att redigera filen .bashrc
i din hemkatalog:
gedit .bashrc
Gedit-redigeraren öppnas med filen .bashrc
.
Gå till botten av filen och lägg till följande export
-kommando:
export PATH=/home/dave/work:$PATH
Spara filen. Stäng sedan fönstret och öppna ett nytt terminalfönster, eller använd punktkommandot för att läsa in .bashrc
-filen:
. .bashrc
Kontrollera sedan sökvägen med:
echo $PATH
Nu läggs mappen /home/dave/work
till i början av sökvägen.
Proceduren för att lägga till kommandot i filen .profile
är likadan. Använd följande kommando:
gedit .profile
Gedit-redigeraren startar med filen .profile
öppen.
Lägg till kommandot export
i slutet av filen och spara den. Stäng sedan fönstret. För att ändringarna ska träda i kraft, behöver du logga ut och in igen eller använda punktkommandot:
. .profile
Ställa in sökvägen för alla användare
För att ställa in sökvägen för alla användare, kan du redigera filen /etc/profile
.
Du behöver använda sudo:
sudo gedit /etc/profile
Lägg till export-kommandot längst ner i filen när gedit-redigeraren startar.
Spara och stäng filen. Ändringarna kommer att träda i kraft nästa gång andra användare loggar in.
Säkerhetsaspekter
Var noga med att inte oavsiktligt lägga till ett inledande kolon (:) i din sökväg, som i exemplet nedan:
Om du gör det, kommer den aktuella mappen att genomsökas först, vilket kan innebära en säkerhetsrisk. Tänk dig att du laddar ned en arkivfil och packar upp den i en mapp. I den mappen finns en annan arkivfil och du använder unzip
en gång till. Om den första arkivfilen innehåller en skadlig körbar fil som heter unzip
, så riskerar du att av misstag starta den i stället för den riktiga unzip
-filen. Detta händer eftersom skalet genomsöker den aktuella mappen först.
Var alltid noggrann när du skriver dina export
-kommandon. Kontrollera med echo $PATH
att allt ser ut som du förväntar dig.