Shell shirámok

A parancssori felület a leghatékonyabb, legproduktívabb felhasználói felület - persze megfelelő mennyiségű tanulás után. Azonban nem annyira hatékony, amennyire lehetne: a ma használatos shellek még mindig a hetvenes-nyolcvanas évek technológiáján alapulnak, holott pl. a programozási nyelvek terén jelentős előrelépések történtek.

Hol van az a shell,

  • amiben nem minden adat szöveg?

    A POSIX-shellekben minden behelyettesítés, így pl. a programkimenetek is, egyetlen sztringgé helyettesítődik be, amiből valamilyen határoló karakter (általában újsor vagy szóköz) segítségével csinálhatsz újra listát. Macerás azzal foglalkozni, hogy mi van, ha a határoló karakter benne van az adatban. Legyenek típusok, legalább skalár, tömb, hash szinten.

  • amiben nem a toolok kimenetének feldolgozásával kell tökölni?

    A legtöbb unixos tool ember által olvasható formázott kimenetet ad, pedig a legtöbb esetben ezt egy másik program olvassa be. Ráadásul ahány tool, annyi formátum, mindegyik után írhatod a saját elemzőt, általában elég egy

    cut

    meg

    grep

    , de sokszor kell a

    sed

    , sőt

    perl

    . Miért nem beszélnek a toolok valami egységes protokollt, amiben strukturált adatokat adhatnak át egymásnak?

  • ami jobban támogatja a pipe technikát?

    A parancssoros felület legnagyobb ereje a pipe. Jól jönne egy olyan shell, ami alapból támogatja azokat a funkciókat, amelyekért most

    sed

    -hez,

    awk

    -hoz vagy

    perl

    -höz kell nyúlni. Pl. ahelyett, hogy

    
    ls -l *.txt | perl -alne '$sum += $F[4]; END { print $sum }'
    

    jó lenne valami ilyesmi

    
    new-ls *.txt | { foreach { $sum += $_.size }; echo $sum }
    

    aholis a

    new-ls

    olyan rekordokat küld át a pipe-on, aminek van egy

    size

    mezője.

  • aminek nem annyira elcseszett a szintaxisa?

    Gondolok itt a hülye blokkjelölésekre, vagy arra, hogy a POSIX-shellekben a

    ( )

    és

    { }

    parancscsoportosítók kulcsszavaknak számítanak, ezért szóközzel kell határolni.

  • ami nem fájlglobbing fetisiszta?

    Ízlések és pofonok, de szerintem a default globbing nem jó, unom, hogy a grep és a find paramétereit mindig védenem kell.

  • amihez fejlett terminál tartozik?

    Amin keresztül nem karaktersorozatok áramolnak, hanem szerkesztett parancssor megy be és parancseredmény jön ki, amihez lapozás, brózolás meg egyéb funkciók társulnak. 2006-ot írunk, 3D-s desktopot futtatunk, de még mindig egy kőkorszaki dumb terminálból kell kiolvasni a parancsok kimenetét, és minden pipe végére oda kell biggyeszteni, hogy less.

Egy másik platformra készül egy shell, ami ezeknek a kívánalmaknak egy részét teljesíti...

Hozzászólások

Nem tudom, szerintem így is elég jó... én szeretem a bash-om. Csak 1 autocomplete kellett hozzá, hogy igazán kényelmes legyen. A dumb terminálosdi pedig pont a legjobb benne, ez teszi igazán hordozhatóvá, univerzálissá. Szerintem. annyit minden tud...

Nem akarok akadékoskodni, de kapj fel egy Bisont, egy termcap leírást, stb. és csináldd meg! :-)

"No boom today. Boom tomorrow. There's always a boom tomorrow. What? Look, somebody's got to have some damn perspective around here. Boom, sooner or later. BOOM!" -- Lt. Cmd. Ivanova

A PowerShell (igaz, beta) mar letoltheto, hasznalhato, csak kell neki a .NET Framework 2.0. Sajnos nem volt sok idom ezzel vacakolni a munkahelyen (ahol van Window$), de tulsagosan is idegen, mintsem hogy valaha is jobban bele akarjam asni magamat.

Örülök, hogy ilyen nagyívű elképzeléseid vannak, bár tény-és-való, hogy kissé hibásak/hiányosak az alapismereteid (de legalábbis a megfogalmazás).

> amiben nem minden adat szöveg?
>
> A POSIX-shellekben minden behelyettesítés, így pl. a
> programkimenetek is, egyetlen sztringgé helyettesítődik be,
> amiből valamilyen határoló karakter (általában újsor vagy
> szóköz) segítségével csinálhatsz újra listát.
> ...
> Legyenek típusok, legalább skalár, tömb, hash szinten.

bash, Korn-shell, POSIX-shell:
skalárt és tömböt tud. Nézz utána a ksh93-nak, az tud hash-t is.
Az meg hab a tortán, hogy a kimenet fogalmát nem keverjük a helyettesítésekkel. Helyettesítésből van a következő 3:
- változóhelyettesítés ( $valami )
- parancshelyettesítés ( `valami` vagy $(valami) )
- tilde-helyettesítés ( ~valaki esetleg ~+ és ~- )
- és kakukktojásnak a 4. :-) az aritmetikai helyettesítés ( $(( kifejezés )) , amit kizárólag bash-ban írhatsz a nem portábilis $[ kifejezés ] formában )
És ezek nem egyetlen sztringgé helyettesítődnek be, amiből neked kell listát csinálni, hanem eleve lista. (A 3. és 4. nem igazán lehet több elemű lista, de az 1. és a 2. igen, ilyenkor kell köré expliciten kiírni a idézőjelet, ha azt akarod, hogy 1 db. sztring legyen.) A kimenet az valóban egy sztring.

> Miért nem beszélnek a toolok valami egységes protokollt,
> amiben strukturált adatokat adhatnak át egymásnak?

Az egységes protokol pont az amit írtál: egy sor = egy rekord, egy rekord = néhány (szóközzel|tabulátorral) elválasztott mező.

A new-ls példád kicsit OO-nak tűnik, de szerintem attól, hogy $_.size -ként hivatkozok rá, nem lesz olvashatóbb a dolog.

> aminek nem annyira elcseszett a szintaxisa?
> Gondolok itt a hülye blokkjelölésekre, vagy arra, hogy a
> POSIX-shellekben a ( ) és { } parancscsoportosítók
> kulcsszavaknak számítanak, ezért szóközzel kell határolni.

Nem látom be, hogy a megszokáson kívül miért jobb egy kapcsoszárójel (vagy BEGIN/END) alapú blokkjelölés vagy pláne egy tabuláláson alapuló (a'la Python) a do/done-nál. Külön érdekesség, hogy használhatsz nyitó/csukó kapcsoszárójelet (Korn-shellben mindenképp), ha neked úgy tetszik, csak mivel nem nagyon szokták dokumentálni, a többség nem tud róla. Ja és persze megjegyzem, a kapcsozárójel kulcsszó (ha jól tudom fenntartott szóként emlegetik), ezzel szemben az elterjedt kerekzárójel nem, ott nyugodtan kihagyhatod a szóközt - no mások pont ezt rühellik a dologban.

> ami nem fájlglobbing fetisiszta?

RTFM, "set -f" parancs (vagy a set -o noglob) a .profile-odba, oszt jól van

> amihez fejlett terminál tartozik

xman konsole gnome-term stb
Ez nem a shell hibája, hogy neked nem felelnek meg a meglevő terminálok, nekem az xterm is jó. Mellesleg egyszer együtt utaztam sok órán keresztül egy majdnem teljesen vak sráccal, órákon keresztül zengett hozsannákat arról, hogy amióta Win van meg grafika, azóta ő és társai meghalnak a számítógéppel, bezzeg a Linux, annak a jó parancssori felülete, meg a mit-tudom-én-milyen szövegfelolvasó amit használnak, no azzal lehet dolgozni.

(Egyébként asszem értem mire gondolsz, de nem sikerült tökéletesen kifejtened :-) )

Az egységes protokol pont az amit írtál: egy sor = egy rekord, egy rekord = néhány (szóközzel|tabulátorral) elválasztott mező.

Keveset tud, mi van a rekordok rekordjaival? :) A parancsbehelyettesítéskor egyébként a sorok és a szóközök mentén egyaránt vág a word splitting. A pipe-ban használható valami ilyesmi:


ls -l | { while read -a array; do sum=$((sum+array[4])); done; echo $sum; }

Használ valaki ilyesmit? ;)

RTFM, "set -f" parancs (vagy a set -o noglob) a .profile-odba, oszt jól van

Nem jó, nem letiltani akarom, hanem külön konstrukcióval használni, mondjuk <*.txt> vagy ilyesmi.