A Linux amely parancs azonosítja a végrehajtható bináris fájlt, amely akkor indul el, amikor parancsot ad ki a shellnek. Ha ugyanannak a programnak különböző verziói vannak a számítógépen, akkor ezek segítségével megtudhatja, hogy a shell melyiket fogja használni.
Tartalomjegyzék
Binárisok és utak
Amikor megpróbál futtatni egy programot vagy parancsot a terminálablakból, a shell (általában Bash modern disztribúciókon) meg kell találnia ezt a parancsot és elindítani. Egyes parancsok, mint pl CD, történelem, és pwd, be vannak építve a héjba, így Bashnak nem kell túl sokat dolgoznia, hogy megtalálja ezeket.
De hogyan találja meg a Bash más parancsokat, programokat és külső, önálló bináris fájlokat? Nos, a Bash az elérési utat használja, ami valójában útvonalak gyűjteménye, amelyek mindegyike egy könyvtárra mutat. Ezután mindegyik könyvtárban megkeresi a futtatni kívánt parancsnak vagy programnak megfelelő végrehajtható fájlt. Amikor talál egyet, Bash elindítja, és felhagy a kereséssel.
Az echo segítségével ellenőrizheti a $PATH környezeti változót, és megtekintheti az elérési útjában lévő könyvtárakat. Ehhez írja be a következőt, majd nyomja meg az Enter billentyűt:
echo $PATH
A kimeneti lista az egyes útvonalakat kettősponttal (:) választja el. Az általunk használt számítógépen a Bash a következő könyvtárakban keres ebben a sorrendben:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/kuka
/user/games
/usr/local/games
/snap/bin
A fájlrendszerben számos /sbin és /bin nevű mappa található, ami némi zavarhoz vezethet.
Figyeld azokat az utakat
Tegyük fel, hogy van egy htg nevű program frissített verziója. Az aktuális könyvtárunkban található, és a következő parancs beírásával futtathatjuk:
./htg
Ez nem egy nagy program – csak kiírja a verziószámot, majd bezár. Az új verzió az 1.2.138.
Egy program futtatásához az aktuális munkakönyvtárban a „./” karaktert kell beírni a program neve elé, hogy a Bash tudja, hol találja.
Mivel ezt a programot bármely könyvtárból szeretnénk futtatni, a végrehajtható fájlt áthelyezzük a /usr/bin könyvtárba. Bash megtalálja azt a programot az útvonalon, és lefuttatja helyettünk.
Nincs szükségünk a végrehajtható fájlra az aktuális könyvtárunkban, és nem kell beírnunk a „./” karaktert a program neve elé, ahogy az alább látható:
sudo mv htg /usr/bin
Most próbáljuk meg futtatni a programot a következő beírásával:
htg
Valami fut, de ez nem az új, frissített programunk. Inkább a régebbi verzió, az 1.2.105.
A melyik parancs
A fent bemutatott probléma az, hogy miért a which parancs lett tervezve.
Ebben a példában a melyiket használjuk, és parancssori paraméterként adjuk át a vizsgált program nevét:
which htg
amely azt jelenti, hogy megtalálta a htg egy verzióját a /usr/local/bin könyvtárban. Mivel ez a hely azon könyvtár előtt jelenik meg, amelybe a frissített htg-t áthelyeztük, a Bash a program korábbi verzióját használja.
Ha azonban az alább látható módon az -a (all) opciót használjuk, amely akkor is folytatja a keresést, ha talál egyezést:
which -a htg
Ezután felsorolja az összes egyezést az elérési út bármely könyvtárában.
Tehát ez a probléma – a program egy korábbi verziója van egy olyan könyvtárban, amely szintén a javításban található. És ezt a könyvtárat a program az előtt keresi, amelybe a program új verzióját bedobtuk.
Az ellenőrzéshez beírhatjuk a következőket, és kifejezetten futtathatjuk a program minden verzióját:
/usr/local/bin/htg
/usr/bin/htg
Ez megmagyarázza a problémát, és a megoldás egyszerű.
Valójában vannak lehetőségeink. A régi verziót törölhetjük a /use/local/bin könyvtárból, vagy áthelyezhetjük a /usr/bin mappából a /usr/local/bin könyvtárba.
Nézze meg ezeket az eredményeket
Két eredmény nem feltétlenül jelent két bináris fájlt.
Nézzünk egy példát, amelyben a which parancsot használjuk az -a (all) kapcsolóval, és keressük a less program verzióit:
which -a less
amely két olyan helyet jelent, ahol a less program egy verziója található, de ez igaz? Furcsa lenne, ha két különböző verzió (vagy ugyanaz a verzió több helyen) kevesebb lenne telepítve egy Linux számítógépre. Tehát nem fogjuk elfogadni a kimenetet, amelyből. Ehelyett ássunk egy kicsit mélyebbre.
Használhatjuk az ls, -l (hosszú lista) és -h (ember által olvasható) opciókat, hogy megnézzük, mi történik:
ls -lh /usr/bin/less
A fájl mérete kilenc bájtban van megadva! Ez biztosan nem a kevesebb teljes másolata.
A lista első karaktere egy „l”. Egy normál fájl első karaktere kötőjel (-) lenne. Az „l” egy szimbólum, amely szimbolikus kapcsolatot jelent. Ha ezt a részletet kihagyta, a –> szimbólum azt is jelzi, hogy ez a szimbolikus link, amelyet egyfajta parancsikonnak is felfoghat. Ez a less másolatára mutat a /bin könyvtárban.
Próbáljuk újra a less verziójával a /bin könyvtárban:
ls -lh /bin/less
Ez a bejegyzés nyilvánvalóan egy „igazi” bináris végrehajtható fájl. A lista első karaktere egy kötőjel (-), ami azt jelenti, hogy normál fájlról van szó, és a fájl mérete 167 KB. Tehát csak egy példány kevesebb van telepítve, de van egy szimbolikus hivatkozás egy másik könyvtárból, amelyet a Bash is megtalál, amikor az elérési utat keresi.
Több parancs ellenőrzése egyszerre
Több programot és parancsot is átadhat ezeknek, és ezeket sorrendben ellenőrzi.
Például, ha beírja:
which ping cat uptime date head
amely végigdolgozza a hozzá adott programok és parancsok listáját, és felsorolja mindegyikhez az eredményt.
Melyik melyik melyik?
Ha annyira kedve tartja, használhatja önmagában is, ha beírja a következőket:
which which
Eltekintve attól, hogy kíváncsiságból piszkálunk a Linux fájlrendszerben, ami akkor a leghasznosabb, ha egy parancstól vagy programtól egyfajta viselkedést vár el, de egy másikat kap.
Ezekben az esetekben melyiket használhatja annak ellenőrzésére, hogy a Bash elindítja azt a parancsot, amelyet használni szeretne.