A which parancs használata Linuxon

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.

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

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:

  Hogyan lehet gyorsan váltani a Gmail-fiókok között Androidon, iPhone-on és iPaden

/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

A

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

A

Most próbáljuk meg futtatni a programot a következő beírásával:

htg

A

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

A

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.

  Hogyan kell játszani a Sniper Elite játékot Linuxon

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

A

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

A

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

A fájl mérete kilenc bájtban van megadva! Ez biztosan nem a kevesebb teljes másolata.

  Csoportok és felhasználók kezelése Linuxon

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

A

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

A

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.