3 mód az elérési útvonal szerkesztésére a parancssorban
A PATH
környezeti változó az egyik legfontosabb része a parancssor használatának Linuxon. Egy modern rendszeren ez gyakran egy nagyon hosszú, könyvtárakból álló, kettősponttal elválasztott sorozat. Ha meg akarsz változtatni egy elemet az elérési útvonaladon, bosszantó lehet, hogy sok különböző könyvtárnevet kell beírnod és szerkesztened, hogy minden rendben legyen. Szerencsére van néhány módszer, amivel megkönnyíthetjük a dolgunkat. Ugyanez igaz bármelyik környezeti változóra, és a legtöbb eszköz, amit mutatok, bármelyiknél működni fog.
Áttekintés
Mint a legtöbb dolog a Linuxban, itt is sokféleképpen érhetjük el a célunkat. Bár azt mondtam, hogy három módja van, valószínűleg végtelen számú módja van, és itt van egy, amit nem számolok bele a háromba:
Ez azonban csak akkor működik, ha egy változó elejére vagy végére akarsz hozzáadni valamit. Tegyük fel például, hogy ~/foo
-t akarsz hozzáadni a PATH
-hez:
# add to the end:
PATH="$PATH:~/foo"
# add to the start:
PATH="~/foo:$PATH"
Ez egyszerű, de nem segít, ha törölni vagy megváltoztatni akarsz valamit a változóban. Akkor sem segít, ha néhány meglévő könyvtár sorrendjét akarod megváltoztatni.
1. módszer: A legnehezebb út
Föltételezve, hogy egy GUI terminálon belül vagy, valószínűleg van módod a szöveg kivágására és beillesztésére. Így egyszerűnek tűnhet, ha azt írja:
echo $PATH
Aztán felveheti a szöveget, és egy új parancssorba beírja PATH="
, majd beillesztheti a szöveg többi részét. Végezd el a változtatásokat, zárd be az idézőjelet, és nyomd meg a Enter
billentyűt. Azt gondolhatod, hogy ez nem sok előrelépés, ha a meglévő szöveget kell szerkesztened, de kiderül, hogy ha a bashben megnyomod a CONTROL+X, CONTROL+E
billentyűt, akkor egy szép szerkesztőablakot kapsz, ahol szerkesztheted a parancsodat. Ez bármilyen paranccsal működik, és nagyon hasznos, amikor egy hosszú parancssort húzol elő az előzményekből, amit ki kell javítanod.
Honnan tudja a bash, hogy melyik szerkesztőt kell használni? A EDITOR
környezeti változóból. Ha nem tetszik az alapértelmezetten előhívott szerkesztő, változtassuk meg az indítófájlunkat (pl. .bashrc), hogy beállítsuk a változót:
EDITOR=nano
Ez jó, de tudunk jobbat is. Hiszen ez a módszer megköveteli, hogy megjelenítsük a változót, némi kézi gépelést, majd másolást és beillesztést végezzünk.
2. módszer: envedit/pathedit
A GitHubon találunk szkripteket az envedithez és a pathedithez. Ezek egyszerű szkriptek, amelyeket elhelyezhetsz a rendszereden valahol, ahol megtalálhatók (például /usr/local/bin). Ha azt szeretnénk, hogy az elérési útvonalon megtalálhatók legyenek, akkor futtathatóvá kell tenni őket (chmod 755
).
A probléma az, hogy a szkript által a környezeten végrehajtott változtatások nem maradnak meg a szkript kilépése után (lásd a Mi a környezet? című részt alább). Ennek eredményeképpen ezeket a fájlokat forráskóddal kell ellátni, hogy működjenek. A pathedit szkript a PATH
-t szerkeszti a kedvenc szerkesztőprogramodban, míg a envedit
egy változó nevet igényel, és ugyanazt a munkát végzi:
# use . or source for these scripts
. pathedit
# or
source pathedit
. envedit PULSE # edit $PULSE
Kicsit idegesítő, hogy állandóan emlékezned kell a forrásolásukra, ezért a szkripteknek van egy speciális funkciójuk. Ha a .bashrc-ben egyszer forrásolod őket, és átadod a alias
argumentumot, a szkriptek beállítanak maguknak egy aliast, így a pathedit vagy az envedit beírásával megtörténik a forrásolás:
. pathedit alias # now just typing pathedit will work
A szokásos módon a szkript a $EDITOR
segítségével tudja, hogy melyik szerkesztőt használja. Ha csak erre a célra akarsz egy speciális szerkesztőt, állítsd be a $PATHEDIT_EDITOR
vagy $ENVEDIT_EDITOR
értéket, és ez felülírja a szokásos beállításokat. Ha ez nincs beállítva, a szkript a $EDITOR
és a $VISUAL
után kutat, mielőtt alapértelmezetten a vi-t választaná.
3. módszer: envedit2/pathedit2
A harmadik módszer szintén ugyanazon a GitHub oldalon található. A művelet ugyanolyan, mint a 2. módszer. Vagyis továbbra is elhelyezed valahova a fájlokat, és a alias
argumentummal hívod meg őket, hogy beállítsd őket. Ezek a szkriptek azonban nem használják a szövegszerkesztődet. Ehelyett betöltik a bash parancssori puffert a szerkesztendő megfelelő karakterlánccal. Ez nagyon hasonlít az első módszerhez, kivéve, hogy a lépéseket automatizálják helyetted.
Ne feledd, hogy amikor bármelyiket is futtatod, akkor egy aliast állítanak be az envedit vagy a pathedit számára, így nem fogod használni a 2-t a használatukhoz, kivéve, amikor beállítod őket. Ez azt is jelenti, hogy az utoljára beállított “nyer”. Nem állíthatod be mindkettőt egyszerre, hacsak nem végzel valamilyen szkriptműtétet, vagy nem állítasz be saját aliasokat.
Amikor bármelyik szkriptet futtatod, előfordulhat, hogy egy furcsa escape karakter jelenik meg a prompt előtt. Ez az állapotjelentés, amely kiváltja a puffer feltöltését. Ez ártalmatlan, és ha zavar, csak nyomd meg a CONTROL+L
billentyűt a képernyő újrarajzolásához.
Ez a te három
Ha csak ezeket a szkripteket akarod használni, akkor kész vagy. Remélem hasznosnak találod őket. Ha nem érdekel, hogyan és miért működik mindez, itt abbahagyhatod. De ha többet akarsz tudni arról, hogy miért vannak ezek a szkriptek aliasok, és hogyan működik a környezet, akkor olvass tovább.
Mi az a környezet?
A környezetre úgy is gondolhatsz, mint egy kis adatbázisra, amit minden programnak átadunk. Például valószínűleg van egy EDITOR
nevű környezeti változója, amely általában valami olyan programra van beállítva, mint a vi, emacs vagy nano. Amikor egy programnak meg kell hívnia egy szövegszerkesztőt, a környezeti változó kiolvasásával megtudja, hogy melyik szerkesztőt szereted használni.
Amikor egy A program elindít egy másik programot (B), a gyermekprogram megkapja a környezet másolatát, bár az A program módosíthatja azt, mielőtt elindítja B-t. A B által végrehajtott módosítások azonban csak B-re és az általa indított programokra érvényesek.
Ez gyakorlatilag azt jelenti, hogy semmi, amit egy elindított programban teszel, nem lesz hatással semmilyen más programra, amely nem a programból indult. Ez a shell szkripteknél valós probléma. Tegyük fel például, hogy olyan szkriptet akarsz írni, amely a PATH
végéhez ~/foo
-öt ad hozzá. Ez nem fog működni:
#!/bin/bash
# Bad example
PATH="$PATH:~/foo"
A probléma az, hogy a szkript a bash saját példányában fog futni. Kötelességtudóan megváltoztatja a PATH
változót, majd kilép, aminek következtében a PATH
új példánya eltűnik. Természetesen a módosítás a szkript bármely más részére is érvényes lenne. Ahhoz, hogy ez működjön, a szkriptet source
-re kellene módosítanod (és akkor nincs szüksége a #! sorra, bár nem árt, ha meghagyod). Tegyük fel, hogy a fenti szkript neve foopath
. Mondhatnád:
source ./foopath
# or the same thing:
. ./foopath
Az említett szkriptek némelyike így működik, a héjba való forráskódolással képesek megváltoztatni a héj aktuális környezetét.
Ez minden, tényleg… Kivéve
Ha idáig eljutottál, gratulálok. Remélem, hasznosnak találod ezeket az eszközöket, és ne felejtsd el jelenteni a hibákat a GitHubon.
Bónusz kör
Mondtam korábban, hogy a kézi kivágás és beillesztés lehet a legnehezebb út. Van azonban egy másik módja is ennek. Ha az /etc/inputrc vagy a ~/.inputrc helyesen van beállítva, akkor beírhatod (de ne nyomd le az Entert):
PATH=$PATH
Aztán nyomd meg az Alt+Control+E billentyűkombinációt, és a shell kibővíti helyetted a $PATH változót. Ha azonban megpróbálod:
PATH="$PATH"
meglátod, hogy a bővítéssel elveszíted az idézőjeleket. Meg kell tenned a kényelmetlen:
PATH=\"$PATH\"
Aztán nyomd meg az Alt+Control+E billentyűkombinációt. A bind -P
kimenetéből megtudhatja, hogy a shell-expand-line
függvény kötődik-e valamihez.