„Nazwy są względne i stworzone po to, by mylić naiwnych. Wielka Wczesna Faworyta uprawiana przez pięć lat, w szóstym da wam koszyk mirabelek”
Autor gdzies umknął
Easy shell być może jest łatwą powłoką, jednak na pewno nie dla tych, którzy są przyzwyczajeni do powłok tradycyjnych. Polubią ją jednak na pewno ci wszyscy, którzy są zakochani w LISP-ie i których nadgarstki odruchowo wyginają się co kilka chwil czując potrzebę postawienia gdzieś nawiasu.
Jeden z moich znajomych ujął to zwięźle: „Jesteś chory”. Myślę, że nie miał racji – nie utrzymuję przecież, że esh jest najlepszą powłoką, ani że ktokolwiek powinien z niej korzystać. Po prostu ją lubię. Jeśli ktoś po przeczytaniu tego artykułu wypróbuje ją, będzie mi bardzo miło – aczkolwiek podejrzewam, że większość straci o mnie resztki dobrego mniemania ;-P.

W zamyśle autorów esh miało być powłoką lekką, pozbawioną różnych ułatwień i oferującą alternatywne do standardowych rozwiązania. Rzeczywiście, esh jest niewielkie; posiada również swoje własne mechanizmy zarządzania pamiecią. Składnia przypomina podzbiór LISP-a, choć oczywiście istnieje wiele różnic. Tak więc:

  $ (+ 2 3)  =>  5  $  

Zadziała zgodnie z oczekiwaniami, ale już:

  $ (setq a 1)  esh: setq is not a command.  $  

nie (za to set – tak).
Dobrze. Co możemy zrobić z esh? W powłoce tej rozróżnienie między poleceniami wbudowanymi a zewnętrznymi ma większe znaczenie niż w innych: te pierwsze powinny być umieszczane w nawiasach:

  $ print 1 (nl)  esh: parse error: special syntax where redirection should be.  $ (print 1 (nl))  1  $  

((nl) to znak końca linii). Możemy definiować własne funkcje przy pomocy polecenia define:

  $ (define h ~(print "Mamusiu, jak tu pięknie!" (nl)))  $ (h)  Mamusiu, jak tu pięknie!  $  

Oprócz normalnego wykonywania poleceń zewnętrznych, istnieje jeszcze jedna metoda, pozwalająca zapoznać się również z kodem wyjścia polecenia:

  $ (cd (get HOME))  $ (cd .BitchX/)  $ ls  BitchX.away  screens  $ (run-simple ~(ls))  BitchX.away  screens  =>  0  $ (run-simple ~(rm redhat))  rm: cannot remove `redhat': Nie ma takiego pliku ani katalogu  =>  1  $  

„Co za ironia” – powiedzą niektórzy „nazwać polecenie uruchamiające inne polecenie <…”. Otóż… zwykłe run jest nieco bardziej skomplikowane, a mianowicie:

  (run (true) (standard) (stderr) ~(ls))  

Gdzie pierwszy argument mówi, czy program ma być uruchomiony w tle, dalej mamy wejście i wyjście, a dopiero na końcu nazwę programu. „run-simple” to po prostu run (false) (standard) (standard)….
(Jeśli irytuje nas standardowy znak zachęty, możemy go łatwo zmienić:

    $(prompt (get USER) "@" (get HOSTNAME) "$" )    q@darkstar$    

)
Esh posiada kilka „niestandardowych”, znanych skądinąd poleceń:

    q@darkstar$(reverse chcecie bajki? oto bajka: była sobie Pchła  Szachrajka)  =>  Szachrajka Pchła sobie była bajka: oto bajki? chcecie  q@darkstar$(squish gdyby kózka nie skakała)  =>  gdybykózkanieskakała  q@darkstar$(chars "Jan 'Isabel' Bielecki")  =>  J a n   ' I s a b e l '   B i e l e c k i  

Domysłom Czytelników pozostawiam rezultat wykonania (clone „honej” 10000). Niezalecane i niebezpieczne.
Jeśli chodzi o pliki, istnieje kilka użytecznych poleceń. (file-type) pozwala określić typ pliku (jeśli go nie ma, zwraca fałsz):

  $ (file-type s)  =>  regular  $ (file-type sh2)  =>  directory  $  

Esh staje się prawdziwie użyteczne dopiero przy parsowaniu list. Warto jednak wcześniej zwrócić uwagę na specyficzny sposób przekazywania parametrów charakterystyczny dla tej powłoki: mianowicie całość to (stack), pierwszy argument wywoływanej funkcji to (top); oprócz standardowych operatorów (pop) i (push) mamy do dyspozycji również „rotator” (rot):

    $ (define a ~(print (stack) (nl) ) )  $ (a 80 90 100)  80 90 100  $ (define a ~(print (rot) (nl) ) )  $ (a 80 90 100)  90  $

Proste, łatwe i przyjemne :). „Gdzie sens, gdzie logika?”[1] – zapytacie. „Na co komu dziś (car ~(czosnek jabłko marchewka))?”. Jak zaznaczałem na wstępie, nikogo nie namawiam do używania esh 😉
Archiwalny news dodany przez użytkownika: arturs.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Oznaczone jako → 
Share →