A titokzatos /bin/[

"Felületes pillantást vetettem az ftp://ftp.icm.edu.pl/ -ről leszedett december 10-ei OpenBSD snapshotból való i386 laptop telepítésemre és észrevettem egy szokatlan futtatható állományt /bin/["

[ Weird executable in /bin/ - i386 snapshots Dec 10 ]

(avagy, az újszülöttnek minden vicc új)

Hozzászólások

Az a baj, hogy van test? Számomra inkább az nem egészen világos, hogy ha van belső shell parancsként, minek külsőként is? Hasonlóképpen pl. az echo esetében.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

bash es dash eseten ez igaz (linuxon az sh altalaban symlink a dash-re), BSD-ken ez amennyire tapasztaltam mashogy van, mas az alap shell, bash pedig nincs is a /bin-ben, boot folyamat alatt altalaban nem is erheto el a /usr mountolasa elott.
A cikkben a megegyezo file meretekbol latszik is hogy az sh, ksh, rksh feltehetoleg ugyanaz, ezekben nincs test vagy "[" builtin es ezt nem neztem meg, de feltehetoen echo sincs.

Ezért kell a -l opció mellett ismerni a -i opciót is és persze tudni, h mi a franc az az i-node (szám). A fájlméret nem igazán egyértelmű azonosítási lehetőség - gondolj pl. a busybox-ra, de sokkal jobb példa a FreeBSD-féle /rescue, ahol ilyen busybox-szerű (de teljesen más megvalósítás) eredményeként van (ezen a gépen pl.) 143 db azonos méretű bináris, amiknek még az ilyen-olyan checksum-ja, meg hash-e is megegyezik (merthogy ugyanaz a bináris 143 különböző linken), de ha /rescue/sh-t indítasz, akkor egy POSIX-shell-szerűség fog futni, míg ha /rescue/csh-t, akkor C-shell! (És hogy a kiindulásra is hivatkozzunk, ha /rescue/test -ként vagy /rescue/[ -ként, akkor a test segédprogram.)

Történelmi okokból van. A korai shellekben sok olyan parancs nem volt belső parancsként elérhető, ami ma (pl. POSIX előírások, vagy más okból) már igen. Tipikusan az echo, test ( vagy [ ) és pwd ilyenek. Sok régi script hivatkozik is a /bin/test-re vagy /bin/echo-ra (a pwd-re és a [-re asszem az életben nem láttam path-szal hivatkozni). Ráadásul a Bourne- és a C-shellek némileg eltérő opciókat ismertek, amikor már lett belső paranacs - ennek (is) lett az egyk következménye, hogy ha valaki biztosan azt a fajtát akarta használni a scriptjében, akkor /bin/test-et írt

Milyen ksh? A pdksh (a saját man-jában is annak hívja magát) doksijában szerepel a [ parancs a "Command Execution" fejezetben, az "Additional ksh regular commands" között, majd részletesen a test parancsnál. Ha ksh93-ról beszélünk, akkor a "Built-in Commands." részben lenne a helye, de valóban nem szerepel a manual-ban sehol a test (vagy [ ) parancs, egyedül a ksh/bash/posix-specifikus [[ forma leírása szerepel - ez tény. (Lehet kéne nekik dobni egy hibajegyet :-) )

$ ksh93
$ type [[
[[ is a keyword
$ type [
[ is a shell builtin
$ type test
test is a shell builtin