Przedmowa: Uwielbiam bash i nie mam zamiaru rozpoczynać żadnego sporu lub świętej wojny i mam nadzieję, że nie jest to niezwykle naiwne pytanie.
To pytanie jest nieco związane z tym postem na superużytkowniku, ale nie sądzę, żeby OP naprawdę wiedział, o co prosi. Używam bash na FreeBSD, Linux, OS X i cygwin w Windows. Niedawno miałem również duże doświadczenie z programem PowerShell w systemie Windows.
Czy istnieje powłoka dla * nix, która jest już dostępna lub działa, która jest kompatybilna z bash, ale dodaje warstwę miksowania obiektowego do skryptu? Jedyne, co wiem na ten temat, to konsola python, ale o ile wiem, nie zapewnia ona dostępu do standardowego środowiska powłoki. Na przykład, nie mogę po prostu cd ~
i ls
, następnie chmod +x file
wewnątrz konsoli Pythona. Musiałbym używać Pythona do wykonywania tych zadań zamiast standardowych plików binarnych unix lub wywoływać pliki binarne za pomocą kodu python.
Czy taka skorupa istnieje?
źródło
cd ~
po tymls
działa jak w Bash. Możesz także przypisać dane wyjściowe zmiennym Pythona (listy linii ... w pewnym sensie) za pomocą poleceń takich jaklisting = !ls
.Odpowiedzi:
Mogę wymyślić trzy pożądane cechy powłoki:
Powłoki uniksowe zwykle koncentrują się na aspekcie interaktywnym i podzlecają większość dostępu do systemu i część programowania zewnętrznym narzędziom, takim jak:
ftp
dla FTPmail
,Mail
,mailx
, Itd. Dla podstawowych e-mailcron
dla zaplanowanych zadańdbus-*
lub qdbus ) do różnych informacji systemowych i zadań konfiguracyjnych (w tym nowoczesnych środowisk pulpitu, takich jak KDE ≥4)Wiele, wiele rzeczy można zrobić, wywołując polecenie z właściwymi argumentami lub danymi wejściowymi. Jest to bardzo skuteczne podejście - lepiej mieć jedno narzędzie na zadanie, które robi to dobrze, niż jeden program, który robi wszystko, ale źle - ale ma swoje ograniczenia.
Głównym ograniczeniem powłok unixowych i podejrzewam, że tego właśnie wymaga twój „skryptowy obiektowy wymóg”, ponieważ nie są dobre w zatrzymywaniu informacji z jednego polecenia do drugiego lub łączeniu poleceń w sposób bardziej wyszukany niż rurociąg. W szczególności komunikacja między programami jest oparta na tekście, więc aplikacje można łączyć tylko wtedy, gdy serializują one swoje dane w zgodny sposób. Jest to zarówno błogosławieństwo, jak i przekleństwo: podejście „wszystko jest tekstem” ułatwia szybkie wykonywanie prostych zadań, ale podnosi barierę dla bardziej złożonych zadań.
Interaktywna użyteczność działa również w przeciwieństwie do obsługi programu. Programy interaktywne powinny być krótkie, wymagać niewielkiego cytowania, nie zawracać sobie głowy zmiennymi deklaracjami lub pisaniem itp. Programy, które można utrzymywać, powinny być czytelne (więc nie mogą mieć wielu skrótów), powinny być czytelne (więc nie musisz się zastanawiać, czy jedno słowo jest łańcuchem, nazwą funkcji, nazwą zmiennej itp.), powinien mieć sprawdzane spójność, takie jak deklaracje zmiennych i pisanie itp.
Podsumowując, powłoka jest trudnym do osiągnięcia kompromisem. Ok, to kończy sekcję rant na przykładach.
Perl Shell (PSH) „łączy interaktywny charakter Unix shell z mocą Perl”. Proste polecenia (nawet potoki) można wprowadzać w składni powłoki; wszystko inne to Perl. Projekt nie był długo rozwijany. Jest użyteczny, ale nie osiągnął punktu, w którym rozważałbym użycie go nad czystym Perlem (do skryptów) lub czystą powłoką (interaktywnie lub do skryptów).
IPython to ulepszona interaktywna konsola Python, szczególnie ukierunkowana na obliczenia numeryczne i równoległe. To stosunkowo młody projekt.
irb (interaktywny ruby) to Rubinowy odpowiednik konsoli Pythona.
scsh to implementacja schematu (tzn. przyzwoity język programowania) z rodzajem powiązań systemowych tradycyjnie występujących w powłokach uniksowych (ciągi, procesy, pliki). Jednak nie ma na celu być użytecznym jako interaktywna powłoka.
zsh to ulepszona interaktywna powłoka. Jego mocną stroną jest interaktywność (edycja wiersza poleceń, uzupełnianie, typowe zadania realizowane zwięzłą, ale tajemniczą składnią). Jego funkcje programowania nie są świetne (na równi z ksh), ale zawiera wiele bibliotek do kontroli terminali, wyrażeń regularnych, sieci itp.
fish to czysty start w powłoce uniksowej. Nie ma lepszych funkcji programowania ani dostępu do systemu. Ponieważ łamie kompatybilność z sh, ma więcej miejsca na rozwijanie lepszych funkcji, ale tak się nie stało.
Dodatek: kolejna część uniksowego zestawu narzędzi traktuje wiele rzeczy jako pliki:
/sys
zapewnia większą kontrolę nad sprzętem i systemem./proc
systemu plików.Być może przyszłością powłok unixowych nie jest lepszy dostęp do systemu za pomocą poleceń (i lepsze struktury kontrolne do łączenia poleceń), ale lepszy dostęp do systemu za pośrednictwem systemów plików (które łączą się nieco inaczej - nie sądzę, że opracowaliśmy kluczowe idiomy (takie jak rura płaszczowa) są jeszcze).
źródło
Nie potrzebujesz dużo kodu bash, aby zaimplementować klasy lub obiekty w bash.
Powiedz 100 linii.
Bash ma tablice asocjacyjne, których można użyć do wdrożenia prostego systemu obiektowego z dziedziczeniem, metodami i właściwościami.
Więc możesz zdefiniować taką klasę:
Utworzenie wystąpienia tej kolejki można wykonać w następujący sposób:
lub
Ponieważ klasy są implementowane za pomocą tablicy, klasa i inst są naprawdę synonimami - podobnie jak w javascript.
Dodawanie elementów do tej kolejki można wykonać w następujący sposób:
Usuwanie elementów do zmiennej X można wykonać w następujący sposób:
Strukturę zrzutu obiektu można wykonać w następujący sposób:
Co zwróciłoby coś takiego:
Klasy są tworzone przy użyciu funkcji klasy takiej jak ta:
UWAGA: Podczas definiowania nowej klasy lub instancji można zastąpić dowolną wartość elementu lub funkcję.
Tablice asocjacyjne Bash mają dziwaczność, która sprawia, że działa to dobrze: $ Q [0]} jest identyczny z $ Q. Oznacza to, że możemy użyć nazwy tablicy do wywołania funkcji wysyłki metody:
Minusem jest to, że nie mogę użyć [0] dla danych, więc moje kolejki (w tym przypadku) zaczynają się od indeksu = 1. Alternatywnie mogłem użyć wskaźników asocjacyjnych, takich jak „q + 0”.
Aby uzyskać i ustawić członków, możesz zrobić coś takiego:
Aby zrzucić strukturę obiektu, zrobiłem to:
UWAGA: Nie jest to wymagane dla OOP w bash, ale dobrze jest zobaczyć, jak powstają obiekty.
Mój projekt OOP nie uwzględniał obiektów w obiektach - z wyjątkiem dziedziczonej klasy. Możesz utworzyć je osobno lub stworzyć specjalny konstruktor, taki jak class (). * obj_dump * musiałby zostać zmodyfikowany w celu wykrycia klas wewnętrznych w celu ich rekurencyjnego wydrukowania.
O! i ręcznie definiuję klasę ROOT, aby uprościć funkcję klasy :
Za pomocą kilku funkcji kolejek zdefiniowałem kilka takich klas:
Utworzono niektóre instancje kolejki i uruchomiono je:
źródło
bash
. Przypomina mi odpowiedź Stephane'a na temat tego, dlaczego nie używać pętli powłoki do przetwarzania tekstu, szczególnie sekcja zatytułowana „koncepcyjnie”, która szczegółowo opisuje różnicę w celach między językami takimi jak C ibash
. unix.stackexchange.com/a/169765/135943ksh93t + wprowadza niektóre koncepcje OO, zachowując składnię powłoki bourne / posix: http://blog.fpmurphy.com/2010/05/ksh93-using-types-to-create-object-orientated-scripts.html
źródło
IPython jest zaskakująco wygodny w użyciu.
Standardowe funkcje powłoki: kontrola zadań, edycja i historia readline, aliasy
cat
ls
cd
ipwd
integracja z pageriem, uruchamianie dowolnej komendy systemowej przez poprzedzenie jej!
lub włączenie%rehashx
, dane wyjściowe komendy przypisywane do zmiennej python, wartości python dostępne jako zmienne powłoki.Specyficzne dla Pythona: ponowne wykorzystanie wyników z ostatnich poleceń, szybki dostęp do dokumentacji i źródła, przeładowanie modułu, debugger. Niektóre wsparcie klastra, jeśli jesteś w to zaangażowany.
To powiedziawszy, uruchamianie złożonych potoków nie odbywa się w Pythonie; będziesz również używać powłoki posix, tylko z klejem, aby przekazywać wartości tam i z powrotem.
źródło
Istnieje Rush, który wykorzystuje ruby i Psh oparte na perlu.
źródło
jq
działa całkiem dobrze jako taka warstwa obiektowa.źródło
Ten jest nieco prostszy w użyciu i konfiguracji, nazwał args itp. Https://github.com/uudruid74/bashTheObjects
Aktualizuję swoją odpowiedź za pomocą przykładu, który jest zgodny z jednym z podstawowych przykładów podanych dla innej odpowiedzi, ale z tą składnią. Przykładowy program jest podobny, ale nie musisz poprzedzać wszystkich zmiennych nazwą klasy (zna to, jak pokazuje metoda kindof ) i myślę, że składnia jest znacznie prostsza!
Najpierw plik klasy. Domyślne zmienne instancji są opcjonalne i są używane tylko wtedy, gdy nie przekazujesz tych wartości do konstruktora.
Teraz na przykład użycie:
UWAGI:
Instrukcja importu nie jest technicznie wymagana, ale wymusza ładowanie klasy w danym punkcie zamiast oczekiwania na pierwszą nową , co może pomóc w zainicjowaniu rzeczy we właściwej kolejności. Zwróć uwagę na łatwość, z jaką możesz ustawić wiele zmiennych instancji jednocześnie.
Istnieją również poziomy debugowania, konstruktory, destruktory, podklasy i podstawowy system odbicia , a pokazane jest print / println w celu zastąpienia echa (czy kiedykolwiek próbowałeś wydrukować zmienną rozpoczynającą się od myślnika?). Przykład na github pokazuje, że działa jako CGI generujący HTML z klas.
Sama biblioteka (oop.lib.sh) nie jest taka prosta (ponad 400 wierszy, 11 KB), ale wystarczy ją dołączyć i zapomnieć.
źródło
Możesz teraz zainstalować PowerShell Core Edition na Linuksie. Działa na platformie .NET Core, która jest aktywnie rozwijana przez Microsoft.
źródło
Jeśli ktoś chce tylko podstaw programowania obiektowego (właściwości i metody), załatwi to naprawdę prosty framework.
Powiedzmy, że chcesz wyświetlać tekst „Hello World” za pomocą obiektów. Najpierw tworzysz klasę obiektową, która ma właściwość wyświetlanego tekstu oraz kilka metod ustawiania i wyświetlania tego tekstu. Aby pokazać, jak wiele instancji klasy może ze sobą współpracować, dodałem dwie metody wyświetlania tekstu: jedną z NewLine na końcu i jedną bez tego.
Plik definicji klasy: EchoClass.class
Zwróć uwagę na słowo „<<InstanceName>>”. Zostanie to później zastąpione, aby utworzyć wiele instancji obiektu klasy. Przed użyciem instancji obiektu potrzebujesz funkcji, która go faktycznie tworzy. Dla uproszczenia będzie to osobny skrypt o nazwie: ObjectFramework.lib
Mamy teraz plik definicji klasy i funkcję CreateObject, która tworzy kopię tego pliku z tekstem „<<InstanceName>>” pod dowolną nazwą.
Użyjmy naszego nowego obiektu w skrypcie o nazwie: HelloWorld.sh (pamiętaj, że HelloWorld.sh powinien być wykonywalny. Pozostałe dwa pliki nie muszą)
Uruchamiając skrypt HelloWorld.sh wyświetla tekst „Hello World” (i dodaje NewLine). Nikt nie będzie pod wrażeniem tego wyniku, ale będziemy wiedzieć, że nie jest to takie proste, jak się wydaje :)
Miłego kodowania!
źródło
Jest to obiektowa powłoka oparta na Pythonie, ale ma sintaxe zbliżone do Golanga: https://github.com/alexst07/shell-plus-plus
Na przykład spróbuj złapać:
przeciążenie klasy i operatora:
i możesz użyć poleceń podobnego bash:
źródło
A teraz, z jakimi przedmiotami przez większość czasu masz do czynienia z powłoką? To pliki / katalogi, procesy i ich interakcja. Tak powinno być
f1.edit
lub coś w tym stylucurrentFile=f1.c ; .edit ; .compile ; .run
. Lubd1.search(filename='*.c' string='int \*')
. Lubp1.stop
,p1.bg
. Takie jest moje rozumienie ooshell.źródło
właśnie próbowałem wprowadzić koncepcje oo do bash na podstawie referencji http://hipersayanx.blogspot.in/2012/12/object-oriented-programming-in-bash.html
źródło
Przepraszam za krótką odpowiedź, ale proszę bardzo.
hipersayanx napisał artykuł Programowanie obiektowe w Bash . Zasadniczo on hi-okradł
$FUNCNAME
,function
,compgen
, iexport
stworzyć jak najbliżej OOP można dostać w bash.Fajne jest to, że działa dobrze i do zbudowania klasy wystarczy kilka linii kotłowania.
Podstawowe potrzebne części to:
Stosowanie:
Teraz wykorzystałem to sam w moim projekcie AuditOps, a hipersayanx ma dalsze szczegóły na temat tego, jak to naprawdę działa na jego stronie. Ostrzeżenie o taryfie, choć jest to bardzo bashism, nie będzie działać z niczym starszym niż bash 4.0 i może prowadzić do bólu głowy podczas debugowania. Chociaż osobiście chciałbym, aby większość poszycia bojlera została przerobiona jako sama klasa.
Zawsze lepiej jest używać poważnego języka skryptowego OOP, takiego jak perl, ruby i python, gdy lepiej pasuje do twojego projektu. Jednak w mojej uczciwej opcji warto poświęcić czas i wysiłek podczas utrzymywania modułowych skryptów bash, aby korzystać z tej metody OOP w bash.
źródło
W GitHub rozwijam funkcję, która działa podobnie jak obiekt HashMap , shell_map .
Aby utworzyć „ instancje HashMap ”, ta funkcja może tworzyć własne kopie pod różnymi nazwami. Każda nowa kopia funkcji będzie miała inną zmienną $ FUNCNAME. $ FUNCNAME jest następnie używany do utworzenia przestrzeni nazw dla każdej instancji Map.
Klucze mapy to zmienne globalne w postaci $ FUNCNAME_DATA_ $ KEY, gdzie $ KEY to klucz dodany do mapy. Te zmienne są zmiennymi dynamicznymi .
Poniżej przedstawię jego uproszczoną wersję, abyś mógł ją wykorzystać jako przykład.
Stosowanie:
źródło
carp "Some error message"; return
tego byłoby znacznie bardziej przejrzyste .[ -z "$KEY" ] && { carp "some message"; return;}
Nie potrzebujesz podpowłoki. Ale tak naprawdę wygląda to na faktycznego kandydata naif ... elif ... elif ... else ... fi
konstrukt - co często nie jest najlepszym wyborem, ale prawdopodobnie jest tutaj. :) (A może zmiana przypadku.)Plumbum to język powłoki podobny do Pythona. Pakuje powłokę jak składnia z Pythonem, co czyni obiekt zorientowanym obiektowo.
źródło