Ahogy újabb és újabb infókat csipegetek fel, úgy fogom egyre jobban a fejemet. Pár apróság, amitől a hajam égnek áll:
- a bash (a javítás előtt) engedélyezte olyan shell-függvény létrehozását, aminek a nevében / szerepel, pl egy peccseletlen bash-ban ez megtehető:
bash$ function /bin/ls { echo jaj ;}
bash$ type /bin/ls
/bin/ls is a function
/bin/ls ()
{
echo jaj
}
bash$ /bin/ls
jaj
bash$ exit
Ez már önmagában agyrém.
- ugye ami igazán szép, hogy kitalálták az exportálható shell-függvény című agybajt. Mivel a környezet UNIX/Linux alatt csak változók (izé=ecet) átadására volt felkészítve, zseniális trükköt használtak agyszüleményük megvalósítására. Ha egy függvényt az "export -f fname" paranccsal exportáltak, akkor tulajdonképpen átkonvertálták változó értékadásnak, és azt a változót aztán exportálták. És hogy a dolog működjön, kellett egy második pont is. Ha a bash találkozott egy olyan környezeti változóval, aminek az értéke a "() {" karakterekkel kezdődött (így néz ki ugye egy shell függvény kezdete), akkor úgy döntött, hogy az ott egy ilyen exportált függvény, amit azon nyomban definiálni kellett - azaz létrehozta (visszakonvertálta) a változóból a parancsot. És persze amikor ez megtörtént, akkor ugyebár lefuttatott egy (vagy több) parancsot. Itt ráadásul elég trehány is volt a drága programozó úr/hölgy, kb leszarta, hogy a shell fv végét a záró kapcsos zárójel elég jól jelzi, ami utána van, annak nem nagyon kéne bármiféle értelmet tulajdonítani. (Ezt jól mutatta a legismertebb teszt.) Természetesen környezeti változó létrehozására elég sok lehetőség adódik, de az, hogy azt a "cél-alkalmazáson" kívül esetleg más saját hatáskörben megcsócsálja, arra az egyszeri ember max a dokumentált dolgokig szokott gondolni. Ez a fenti borzalom viszont nem volt dokumentálva (no jó, én nem találtam, persze ha valaki olvasta, nyugodtan dobhat egy linket).