bash to perl

Sziasztok!
A helyzet a következő: munkám során jópár dolgot -eleinte kényelmi szempontból- bash scriptekkel valósítottam meg. Elérkezett a pillanat, amikor a főnök felvetette, hogy mindezeket a dolgokat jó lenne webről is működtetni, így a többiek is "felhasználóbarátabb" környezethez jutnának. Hirtelen (mivel PHP-t nem akart, hogy telepítsek) a CGI/Perl tűnt a legkézenfekvőbb megoldásnak. Tettem is egy szép kis keretet a cuccaim köré, viszont ez a sebesség rovására ment. Pillanatnyilag a feladatom az, hogy mindazt, ami bash-ben ilyen-olyan coreutils-ban található parancsokat (cat,echo,if,case,for,sed,grep,effélék..szóval nem bonyolult dolgokat) hívogat meg meg kéne valósítanom perl-ben. Nem a feladat nehézségén, hanem az időtartamán van a hangsúly. Létezik valami bash to perl inline translator, ami ezeket az alapvető parancsokat "lefordítja" perl-re? Nincs kedvem hatalmas overheaddel újraírni mindent, inkább gondoltam, a kialakult eredményben vadásznám csak ki a hibákat... (tester volnék, vagy mi a szösz.. ;)) UTFG nem hazudott túl sok értelmeset, vagy csak én nem kérdeztem értelmesen, így gondoltam, itt nekiállok kérdezősködni, mielőtt végső elkeseredésemben mindent nulláról írnék újra... Ha van valami ötlet, kérlek, ne legyetek restek informálni!
Előre is kösz,
sha

Hozzászólások

Ne gondolkozz ilyenekben, írd meg szépen őket Perlben. Még ha van is ilyen fordító, akkor sem nyersz vele semmit sebességben, ahogy írtad, két okból:

1. Egy ilyen fordító nem döntheti el helyetted, hogy egy nem telepített, sőt csomagból nem telepíthető, de CPAN-on fellelhető Perl modult használjon X feladat megoldására, vagy hívjon ki egy külső programra.

2. Egy ilyen fordító csak szintaktikailag fordíthat, amivel sok esetben nem vagy kisegítve. Pl. adott az alábbi Bash kód:
cat foo.txt | while read line; do ...; done
Ennek a while ciklusnak a hasában ugyebár hiába állítgatsz bármilyen változót, annak nem lesz hatása a ciklus után, mert a pipe miatt új shellben történt mindez.
Ez egy normális környezetben nem így van. Most a fordító találja ki hogy az ezt kikerülő hekkelgetéseidet hogyan lehet szépen megírni Perlben?

Nem is a "szép" megoldásról van itt szó. Csak gondoltam, legenerálok valami perl-t, és azt a kódot átfutom, javítgatom, talán hamarabb elkészülök, mintha nulláról állok neki megírni mindent... De ha esélytelennek tartjátok, kénytelen leszek újra írni mindent...

--
"It all keeps adding up / I think I'm cracking up / Am I just paranoid? / I'm just stoned"
/Green Day - Basket Case/

bash szkriptet apache-on keresztul meghivni nem opcio?

Ez a mostani állapot. adott egy bash script, ami kidob adatokat stdout-ra. Ezt meghívom perl-ből, és köré pakolom a html-t, valamint a html-en különböző kattintgatások hatására szintén perl-en keresztül más bash scripteket hívogatok meg, ami így nem valami gyors... Mindezt szeretném átültetni kizárólag perl-be, viszont időigényes lenne újra megírni mindent...

--
"It all keeps adding up / I think I'm cracking up / Am I just paranoid? / I'm just stoned"
/Green Day - Basket Case/

Mérd ki, hogy az egyes bash scriptek mennyi idő alatt futnak, esetleg az egyes scripteken belül mik az időigényes funkciók.
A leglassab shell scripteket átírhatod perl-be, vagy a scriptek egyes részeit.
Az is dob a dolgon, ha nem hívogatod meg folyton a perl binárist folyton a scriptjeidből, hanem fast-cgi -n keresztül használod.

Gyors átálláshoz javaslom a bash+cgi párost, azzal a kitétellel, ha "szabvány" sh-ban írtad, akkor a dash-sal futtatva jobb futási eredményt kaphatsz. Amíg ők ezt nyomogatják, portolhatsz :-D

Ezt kifejtenéd bővebben? Pillanatnyilag perl+cgi-n keresztül system() segítségével hívogatom a bash-t... bash-t hogy hívok cgi-n keresztül? Tudok neki megadni paramétereket? Jameg izé... WTF dash? :)

--
"It all keeps adding up / I think I'm cracking up / Am I just paranoid? / I'm just stoned"
/Green Day - Basket Case/

A CGI nem csak Perl-ben íródhat, hanem akár bash-ban, de lehet egy bináris is. A lényeg, h executable legyen.
Be kell állítani a http szervert hogy kezelje a cgi-t.
Lighty esetén:
mod_cgi modul akiválása.
valamint:


alias.url += ( "/cgi-bin" =>  "<cgi szkriptek helye>" )
$HTTP["url"] =~ "^/cgi-bin" {
    cgi.assign = ( "" => "" )
    }

Egy példa d(b)ash/cgi (hívjuk hello.sh-nak):


#!/bin/dash
echo Content-Type: text/html
echo
echo "<html>"
echo "<body>"
echo "<h1>Hello World</h1>"
echo "<pre>" $QUERY_STRING "</pre>"
echo "</body>"
echo "</html>"

Ha lekéred a webszervereden a /cgi-bin/hello.sh?AAA=bbb-t, érdekes eredményt fogsz látni.

DASH:
debianon "apt-get install dash" -sal telpítheted a dash sh interpretert, mely gyorsabb futást biztosít, kevesebb memóriát zabál (állítólag, bár ubuntuék is megerősítik a hírt https://wiki.ubuntu.com/DashAsBinSh).

forráskód:
http://gondor.apana.org.au/~herbert/dash/

Ha a kódod nem dash kompatibilis, maradhatsz a bashnál, amíg perlre migrálgatsz.
remélem, segített.