A titokzatos /bin/[

 ( trey | 2014. december 28., vasárnap - 10:45 )

"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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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

Köszönöm szépen. :)


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

ezek szerint tevedtem. :)
Mindenesetre egy google "ksh man page" keresessel talalt oldalon nem szerepelt a builtin-ek kozott es most kiprobalva sajat man page-en sem, viszont gyakorlatban van.

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

a kill a legfontosabb belső parancs, nem? :)

Szervác Attila - http://321.hu/sas