( Zahy | 2012. 02. 08., sze – 20:13 )

De fogtam, és pont az a lényeg, hogy ettől nem lesz jobb. A "which" pontosan ugyanazt a parancsot adja vissza, mint amit a shell mindenféle hókusz-pókuszok nélkül megtalálna. Sőt rosszabb is annál, mintha csak simán beírnám a parancs nevét. Ugyanis amikor X parancsot futtatom (ahol a parancsszóban nincs pl "/"), akkor shelltől függő módon
- először megvizsgálja a shell aliasok listáját, és ha van ilyen nevű alias, akkor végrehajtódik a helyettesítés, és kezdi előlről a parancsfeldolgozást. (Nyilván olyan shellben - pl. original Bourne-shell - amiben nincs alias, ez kimarad)
- aztán a shell belső parancsok listáját
- aztán a shell-függvények listáját (nyilván ha a shellben ilyen nincs - csh, tcsh - akkor ez a lépés sem játszik)
- és csak a legvégén jön a PATH ellenőrzés.

Ha a "which" a shell beépített parancsa, akkor láthatja az első hármat, és visszaadhatja az erre vonatkozó információt (ilyen pl. a tcsh - FreeBSD-ben X éve csh néven is az érhető el), pl:

% which which
which: shell built-in command.
% which h
h: aliased to history 25
%

míg ha külső parancs, akkor az alias, belső parancs, shell-fv kategóriába tartozó dolgokat nem is látja, tehát csak a PATH-beli dolgokat találhatja meg. Viszont ha meg ezt akarja az ember elérni (azaz a PATH-beli, külső parancsot), akkor annak ennél a nyakatekert "X=$(which x)" módszernél van egyszerűbb megoldása: a parancs nevének bármelyik karakterét takard el a \ "" vagy '' kaarkterek valamelyikével, pl:

% \which which
/usr/bin/which
%

És igen, sokat lehet szívni azzal, hogy milyen "shell"ben mik a belsőleg megvalósított dolgok (kezdve a klasszikus test, [ , time , type parancsokkal), de bekavarhat pl. az, hogy Busybox a shell-ed, amibe aztán beleépítettek nem túl megszokott belső parancsokat is.

No szóval: semmi értelme nincs ennek a használati formának.