Dlaczego języki skryptowe (np. Perl, Python, Ruby) nie są odpowiednie jako języki powłoki? [zamknięte]

Obecnie pytanie to nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub wiedzą specjalistyczną, ale to pytanie będzie prawdopodobnie wywoływało debatę, argumenty, ankiety lub rozszerzoną dyskusję. Jeśli uważasz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, odwiedź Pomoc centrum dla wskazówek. Zamknięty 7 lat temu .

Jakie są różnice między językami powłoki, takimi jak bash, zsh, fish i języki skryptowe powyżej, które czynią je bardziej odpowiednimi dla powłoki?

Przy użyciu wiersza poleceń języki powłoki wydają się być znacznie łatwiejsze. Wydaje mi się, że znacznie płynniej jest używać Basha na przykład niż użyj profilu powłoki w ipython, pomimo raportów przeciwnych . Myślę, że większość wil zgadza się ze mną, że duża część programowania średniej i dużej skali jest łatwiejsza w Pythonie niż w bash. Używam Pythona jako języka, z którym jestem najbardziej zaznajomiony, to samo dotyczy Perla i Ruby.

Próbowałem wyartykułować powód, ale nie jestem w stanie, poza założeniem, że traktowanie strun inaczej w obu ma z tym coś wspólnego.

Powodem tego pytania jest że mam nadzieję rozwinąć język użyteczny w obu Jeśli znasz taki język, napisz go również.

Jak wyjaśnia S. Lott, pytanie wymaga wyjaśnienia. Pytam o cechy języka powłoki kontra języków skryptowych. Tak więc porównanie Nie dotyczy cech różnych interaktywnych (REPL) środowisk, takich jak historia i podstawianie wiersza poleceń. Alternatywnym wyrażeniem pytania byłoby be:

Czy język programowania, który nadaje się do projektowania złożonych systemów, może jednocześnie wyrażać przydatne jednowiersze, które mogą uzyskać dostęp do systemu plików lub zadań kontrolnych? Czy język programowania może być skalowany zarówno w górę, jak i w dół?

Author: Gilles 'SO- stop being evil', 2010-09-03

12 answers

Jest kilka różnic, które mogę wymyślić; po prostu pomyślałem tutaj, w żadnej konkretnej kolejności:

  1. Python & Co. są zaprojektowane tak, aby były dobre w skryptach. Bash & Co. są zaprojektowane tak, aby były tylko dobre w skryptach, bez absolutnie żadnych kompromisów. Iow: Python został zaprojektowany tak, aby był dobry zarówno w skryptach, jak i nie-skryptach, Bash dba tylko o Skrypty.

  2. Bash & Co. są untyped, Python & Co. są mocno wpisane, co oznacza, że liczba 123, łańcuch 123 i plik 123 są zupełnie inne. Są one jednak nie zapisywane statycznie , co oznacza, że muszą mieć dla nich różne literały, aby je rozdzielić.
    Przykład:

                    | Ruby             | Bash    
    -----------------------------------------
    number          | 123              | 123
    string          | '123'            | 123
    regexp          | /123/            | 123
    file            | File.open('123') | 123
    file descriptor | IO.open('123')   | 123
    URI             | URI.parse('123') | 123
    command         | `123`            | 123
    
  3. Python & Co. są zaprojektowane do skalowania w górę do 10000, 100000, a może nawet 1000000 programów liniowych, Bash & Co. są przeznaczone do skalowania w dół do 10 znaków programów.

  4. W Bash & Co., pliki, katalogi, deskryptory plików, procesy są obiektami pierwszej klasy, w Pythonie tylko obiekty Pythona są obiektami pierwszej klasy, jeśli chcesz manipulować plikami, katalogami itp., musisz najpierw owinąć je w obiekt Pythona.

  5. Programowanie powłoki jest w zasadzie programowaniem przepływu danych. Nikt tego nie zdaje sobie sprawy, nawet ludzie, którzy piszą powłoki, ale okazuje się, że powłoki są w tym całkiem dobre, a języki ogólnego przeznaczenia nie tak bardzo. W świecie programowania ogólnego przeznaczenia, dataflow wydaje się być postrzegany głównie jako model współbieżności, nie tyle jako paradygmat programowania.

Mam wrażenie, że próba rozwiązania tych kwestii przez przykręcanie funkcji lub DSL do ogólnego języka programowania nie działa. Przynajmniej nie widzę jeszcze przekonującej realizacji. Jest RuSH (Ruby shell), który próbuje zaimplementować powłokę w Rubim, jest rush, który jest wewnętrznym DSL do programowania w powłoce w Ruby, jest Hotwire, co jest skorupą pytona, ale IMO żaden z nich nie jest nawet bliski konkurowania z Bashem, Zsh, rybą i przyjaciółmi.

[[18]] faktycznie, IMHO, najlepsza obecna powłoka to Microsoft PowerShell, co jest bardzo zaskakujące, biorąc pod uwagę fakt, że od kilku dekad Microsoft nieustannie ma najgorsze powłoki evar . To znaczy, COMMAND.COM? Naprawdę? (Niestety, nadal mają gówniany terminal. On wciąż "wiersz polecenia", który istnieje od tego czasu, co? Windows 3.0?)

PowerShell został stworzony przez ignorowanie wszystkiego, co Microsoft kiedykolwiek zrobił (COMMAND.COM, CMD.EXE, VBScript, JScript) i zamiast tego zaczynając od powłoki Uniksa, następnie usuwając wszystkie Znaki zgodności wstecznej (jak backticki do zastępowania poleceń) i masując je trochę, aby uczynić je bardziej przyjaznymi dla systemu Windows (jak używanie obecnie nieużywanego backtic jako znaku escape zamiast odwróconego ukośnika, który jest ścieżką znak separatora komponentów w systemie Windows). Potem dzieje się magia.

Rozwiązują problem 1 i 3 Z góry, zasadniczo dokonując odwrotnego wyboru w porównaniu do Pythona. Python dba o duże programy po pierwsze, skrypty po drugie. Bash dba tylko o Skrypty. PowerShell dba o skrypty po pierwsze, duże programy po drugie. Przełomowym momentem było dla mnie obejrzenie filmiku z wywiadu z Jeffreyem Snoverem (głównym projektantem PowerShell), kiedy rozmówca spytał go, jak duży program można napisać Powershellem, a Snover odpowiedział nie tracąc bitu: "80 znaków."W tym momencie zdałem sobie sprawę, że jest to wreszcie facet w Microsofcie, który" dostaje " programowanie powłoki (prawdopodobnie związane z faktem, że PowerShell nie był ani rozwijany przez grupę języków programowania Microsoftu (tj. lambda-calculus math nerds), ani Grupa OS (Kernel nerds), ale raczej Grupa serwerów (tj. sysadmins którzy faktycznie używają{[24]]} shells)), i że powinienem chyba poważnie przyjrzeć się Powershellowi.

Liczba 2 jest rozwiązywana przez statyczne wpisywanie argumentów. Możesz więc napisać po prostu 123 i PowerShell wie, czy jest to łańcuch znaków, czy liczba, czy plik, ponieważ cmdlet (tak nazywa się polecenia powłoki w PowerShell) deklaruje typy swoich argumentów powłoce. Ma to dość głębokie konsekwencje: w przeciwieństwie do Uniksa, gdzie każde polecenie jest odpowiedzialne za parsowanie własnych argumentów ( shell w zasadzie przekazuje argumenty jako tablicę łańcuchów), parsowanie argumentów w PowerShell jest wykonywane przez PowerShell . Cmdlety określają wszystkie swoje opcje, flagi i argumenty, a także ich typy, nazwy i dokumentację (!) do powłoki, która następnie może wykonywać parsowanie argumentów, uzupełnianie tabulatorów, IntelliSense, wyskakujące okienka dokumentacji wbudowanej itp. w jednym scentralizowanym miejscu. (Nie jest to rewolucyjne, a projektanci PowerShell uznają powłoki takie jak cyfrowy język poleceń (DCL) oraz IBM OS / 400 Command Language (CL)zgodnie z art. Dla każdego, kto kiedykolwiek używał AS/400, powinno to brzmieć znajomo. W OS/400 możesz napisać polecenie powłoki, a jeśli nie znasz składni pewnych argumentów, możesz je po prostu pominąć i nacisnąć F4, co spowoduje wyświetlenie menu (podobnego do formularza HTML) z oznaczonymi polami, rozwijanym menu, tekstami pomocy itp. Jest to możliwe tylko dlatego, że system operacyjny wie o wszystkich możliwych argumentach i ich typach.) W powłoce Unix, to informacje są często powielane trzy razy: w argumencie parsującym kod w samym poleceniu, w skrypcie bash-completion do uzupełniania tabulatorów i na stronie podręcznika.

Numer 4 rozwiązuje fakt, że PowerShell działa na silnie wpisanych obiektach, które obejmują takie rzeczy, jak pliki, procesy, foldery i tak dalej.

Numer 5 jest szczególnie interesujący, ponieważ PowerShell jest jedyną powłoką, jaką znam, gdzie ludzie, którzy ją napisali, byli w rzeczywistości świadomy faktu, że powłoki są zasadniczo silnikami przepływu danych i celowo zaimplementował je jako silnik przepływu danych.

Kolejną miłą rzeczą w PowerShell są konwencje nazewnictwa: wszystkie cmdlety są nazwane Action-Object, a ponadto istnieją również ustandaryzowane nazwy dla konkretnych akcji i konkretnych obiektów. (Ponownie, powinno to brzmieć znajomo dla użytkowników OS / 400.) Na przykład wszystko, co jest związane z otrzymywaniem pewnych informacji nazywa się Get-Foo. I wszystko, co działa na (sub-)obiekty nazywa się Bar-ChildItem. Tak więc, odpowiednikiem ls jest Get-ChildItem (chociaż PowerShell zapewnia również wbudowane aliasy ls i dir – W rzeczywistości, gdy ma to sens, dostarczają zarówno aliasy uniksowe, jak i CMD.EXE, a także skróty (gci w tym przypadku)).

Ale killer feature IMO to mocno typowany obiekt. Podczas gdy PowerShell wywodzi się z powłoki Uniksa, istnieje jedno bardzo ważne rozróżnienie: w Uniksie cała komunikacja (zarówno poprzez rury, jak i przekierowania, jak również za pomocą argumentów poleceń) odbywa się za pomocą niestrukturalnych ciągów znaków. W PowerShell są to silnie wpisane, uporządkowane obiekty. To jest tak niewiarygodnie potężne, że naprawdę zastanawiam się, dlaczego nikt inny o tym nie pomyślał. (Cóż, mają, ale nigdy nie stały się popularne.) W moich skryptach powłoki, szacuję, że do jednej trzeciej poleceń jest tam tylko po to, aby działać jako adapter między dwoma innymi poleceniami, które nie zgadzają się na wspólny format tekstowy. Wiele z tych adapterów odchodzi w PowerShell, ponieważ cmdlety wymieniają strukturyzowane obiekty zamiast tekstu niestrukturalnego. Jeśli spojrzysz wewnątrz poleceń, to w zasadzie składają się one z trzech etapów: parsowania tekstu wejściowego do wewnętrznej reprezentacji obiektu, manipulowania obiektami, przekształcania ich z powrotem na tekst. Ponownie, pierwszy i trzeci etap zasadniczo znikają, ponieważ dane są już dostarczane jako obiekty.

[18]. projektanci zadbali jednak o zachowanie dynamiki i elastyczność skryptów powłoki poprzez tzw. Adaptive Type System .

W każdym razie, nie chcę robić z tego reklamy PowerShell. Jest wiele rzeczy, które nie są tak świetne w PowerShell, chociaż większość z nich ma związek albo z Windowsem, albo z konkretną implementacją, a nie tak bardzo z koncepcjami. (Np. fakt, że jest on zaimplementowany w. NET oznacza, że pierwsze uruchomienie powłoki może zająć do kilku sekund, jeśli. NET framework nie jest już w pamięci podręcznej systemu plików z powodu innej aplikacji, która tego potrzebuje. Biorąc pod uwagę, że często używasz powłoki przez mniej niż sekundę, jest to całkowicie niedopuszczalne.)

Najważniejszą kwestią, którą chcę poruszyć, jest to, że jeśli chcesz spojrzeć na istniejącą pracę w językach skryptowych i powłokach, nie powinieneś zatrzymywać się na Uniksie i rodzinie Ruby/Python/Perl/PHP. Na przykład, Tcl było już wspomniane. Rexx byłby to inny język skryptowy. Emacs Lisp byłby kolejnym. A w obszarze powłoki znajdują się niektóre z już wymienionych powłok mainframe/midrange, takich jak linia poleceń OS/400 i DCL. Również RC Plan9.

 461
Author: Jörg W Mittag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-10 16:57:52

To kulturowe. powłoka Bourne ' ama prawie 25 lat; był jednym z pierwszych języków skryptowych i pierwszym dobrym rozwiązaniem centralnej potrzeby administratorów uniksowych. (Tj. 'klej' do łączenia wszystkich innych narzędzi i wykonywania typowych zadań uniksowych bez konieczności kompilowania cholernego programu C za każdym razem.)

Według współczesnych standardów jego składnia jest okropna, a jego dziwne zasady i styl interpunkcji jako oświadczenia (przydatne w latach 70. policzone) utrudniają nie-adminom penetrację. Ale to się udało.[4]} wady i niedociągnięcia zostały rozwiązane przez ewolucyjne ulepszenia w jego potomkach (ksh, bash, zsh) bez konieczności godzenia się z ideami stojącymi za tym. Admini trzymali się podstawowej składni, ponieważ, jak to było dziwne, nic innego nie poradziło sobie z prostymi rzeczami lepiej, nie wchodząc w drogę.

W przypadku złożonych rzeczy, pojawił się Perl i przekształcił się w rodzaj języka pół-admina, pół-aplikacji. Ale bardziej skomplikowane staje się coś, tym bardziej jest postrzegane jako aplikacja, a nie praca admina, więc ludzie biznesu mają tendencję do szukania "programistów", a nie" adminów", aby to zrobić, pomimo faktu, że odpowiedni rodzaj Geeka zwykle jest jednym i drugim. Tak więc na tym się skupiliśmy, a ewolucyjne ulepszenia możliwości aplikacji Perla zaowocowały...Python i Ruby. (To uproszczenie, ale Perl był jedną z kilku inspiracji dla obu języków.)

Wynik? Specjalizacja. Admini zazwyczaj myślą, że współczesne języki interpretowane są zbyt ciężkie na rzeczy, za które płacą codziennie. I ogólnie mają rację. Nie potrzebują przedmiotów. Nie dbają o struktury danych. Potrzebują poleceń. potrzebują kleju. nic innego nie próbuje robićpoleceń lepiej niż koncepcja powłoki Bourne ' a (może poza Tcl, o którym tu już wspomniano); a Bourne jest wystarczająco dobry.

Programiści - którzy w dzisiejszych czasach mają aby dowiedzieć się więcej o devops-spójrz na ograniczenia powłoki Bourne ' a i zastanów się, jak do cholery ktokolwiek mógł z tym wytrzymać. Ale narzędzia, które znają, choć z pewnością skłaniają się ku Uniksowemu stylowi operacji We / Wy i plików, nie są lepsze do tego celu. Pisałem takie rzeczy jak skrypty kopii zapasowych i jednorazowe zmiany nazw plików w Rubim, ponieważ znam to lepiej niż bash, ale każdy dedykowany admin mógłby zrobić to samo w bash -- prawdopodobnie w mniejszej liczbie wierszy i z mniejszym obciążeniem, ale tak czy siak, to działa równie dobrze.

Często się pyta "dlaczego wszyscy używają Y Kiedy Z jest lepszy?"--ale ewolucja w technologii, podobnie jak ewolucja we wszystkim innym, ma tendencję do zatrzymywania się na wystarczająco dobrym. "lepsze" rozwiązanie nie wygra, chyba że różnica jest postrzegana jako frustracja przełamująca rozdanie. Skrypty typu Bourne ' a mogą być frustrujące dla Ciebie , ale dla ludzi, którzy używają go cały czas i dla zadań to było przeznaczone, zawsze wykonywało swoją pracę.

 56
Author: SFEley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-08 00:33:52

Język powłoki musi być łatwy w użyciu. Chcesz wpisać jednorazowe polecenia wyrzuć, a nie małe programy. Czyli chcesz wpisać

ls -laR /usr

Nie

shell.ls("/usr", long=True, all=True, recursive=True)

To (również) oznacza, że języki powłoki nie dbają o to, czy argument jest opcją, łańcuchem znaków, liczbą czy czymś innym.

Ponadto, konstrukcje programistyczne w powłokach są dodatkiem, a nawet nie zawsze są wbudowane. Rozważmy kombinację if i [ w (ba) sh, seq do generowania sekwencji, i tak dalej.

Wreszcie, powłoki mają specyficzne potrzeby, których potrzebujesz mniej lub inaczej w programowaniu. Rury, przekierowanie plików, kontrola procesu / zadania i tak dalej.

 50
Author: Ivo van der Wijk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 16:35:30

Jeśli znasz taki język, proszę również go opublikować.

Tcl jest jednym z takich języków. Głównie dlatego, że jest przeznaczony przede wszystkim jako interpreter powłoki dla programów CAD. Oto doświadczenie programisty Pythona w zrozumieniu, dlaczego tcl został zaprojektowany w taki sposób, w jaki był: http://www.yosefk.com/blog/i-cant-believe-im-praising-tcl.html

Dla mnie pisałem i używałem i ulepszałem TCL shell (oczywiście napisany w tcl) jako mój główny Linux login shell on my homebrew router: Pure TCL readline

Niektóre z powodów, dla których lubię tcl ma wszystko wspólnego z podobieństwem jego składni do tradycyjnych powłok:

  1. Najbardziej podstawową składnią tcl jest command argument argument.... Nie ma nic więcej. Jest to to samo co bash, csh lub nawet DOS shell.

  2. Bareword jest uważany za ciąg. Jest to znowu podobne do tradycyjnych powłok pozwalających pisać: open myfile.txt w+ zamiast open "myfile.txt" "w+".

  3. Ze względu na podstawy 1 i 2 tcl kończy się bardzo mało obcej składni. Piszesz kod z mniejszą interpunkcją: puts Hello zamiast printf("Hello");. Pisząc programy nie odczuwasz bólu tak bardzo, ponieważ spędzasz dużo czasu na rozmyślaniu o tym, co napisać. Kiedy używasz powłoki do kopiowania pliku, nie wydaje ci się, że po prostu wpisujesz i musisz wpisywać ( i " i , i ) i ; raz po raz irytuje cię bardzo szybko.

*uwaga: nie ja, jestem hardkorowym programistą tcl

 41
Author: slebetman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 16:46:38

Kto powiedział, że nie są? Zobacz też Zoidberg. REPLs (Read Eval Print Loops) tworzy gówniane powłoki, ponieważ każde polecenie musi być poprawne składniowo, a uruchamianie programu wychodzi z:

foo arg1 arg2 arg3

Do

system "foo", "arg1", "arg2", "arg3"
I nawet nie każ mi robić przekierowań.

Więc potrzebujesz niestandardowej powłoki (a nie REPL), która rozumie polecenia i przekierowania oraz język, którego chcesz użyć do łączenia poleceń. I think zoid (the Zoidberg shell) robi całkiem dobrą robotę.

 17
Author: Chas. Owens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 17:17:47

Ten wątek zainspirował mnie do przejęcia obsługi powłoki opartej na perlu Zoidberg. Po kilku poprawkach jest ponownie użyteczny! Sprawdź user ' s guide lub zainstaluj Bundle::Zoidberg Korzystanie z ulubionego klienta CPAN.

 13
Author: Joel Berger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-20 10:57:48

Nie.


nie, języki skryptowe prawdopodobnie nie są odpowiednie dla powłok.


Problemem jest dychotomia międzymakro językami a, cóż, wszystkim innym.

Powłoka jest w kategorii z innymi starszymi językami makro, takimi jak nroff i m4 . W tych procesorach wszystko jest ciągiem znaków i procesor definiuje mapowanie od ciągów wejściowych do wyjściowych.

Pewne granice są przekraczane w obu Kierunki we wszystkich językach, ale zazwyczaj jest dość jasne, czy Kategoria systemu to makro , czy, hmm, nie znam oficjalnego terminu ... Powiem "prawdziwy język".

Więc pewnie, możesz wpisać wszystkie swoje polecenia w języku takim jak Ruby, i może to być nawet drugi najlepszy wybór do prawdziwej powłoki, ale nigdy nie będzie to język makr. Jest zbyt wiele składni do uszanowania. To wymaga zbyt wielu cytatów.

Ale język makr ma swoje problemy kiedy zaczniesz w nim programować, ponieważ trzeba było pójść na zbyt wiele kompromisów, aby pozbyć się całej składni. Ciągi są wpisywane bez cudzysłowów. Różne ilości magii muszą być ponownie wprowadzone, aby wprowadzić brakującą składnię. Zrobiłem kiedyś w nroffie code-golf, żeby być innym. To było dość dziwne. Kod źródłowy do dużych implementacji w językach makr jest przerażający.

 9
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-15 06:24:36

Myślę, że to kwestia parsowania. Języki powłoki domyślnie zakładają, że $ command oznacza, że masz na myśli polecenie do uruchomienia, Python / Ruby wymaga wykonania systemu("command") lub co innego. Nie chodzi o to, że są nieodpowiednie, tylko o to, że nikt jeszcze tego nie zrobił, przynajmniej tak myślę. Rush http://rush.heroku.com/{[2] } jest przykładową próbą w Ruby, Python ma "iPython" lub coś w tym stylu.

 6
Author: rogerdpack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 17:53:47

Ponieważ oba języki są formalnie językami programowania, to co można robić w jednym, można robić w drugim. W rzeczywistości jest to kwestia nacisku na projekt. Języki powłoki są zaprojektowane do interaktywnego użytku, podczas gdy języki skryptowe nie są.

Podstawową różnicą w projekcie jest przechowywanie danych między poleceniami a zakresem zmiennych. W Bash itp. musisz przeskoczyć przez obręcze, aby zapisać wartość( na przykład polecenia takie jak set a='something'), podczas gdy w językach takich jak Python po prostu używasz assignment statement (a = 'something'). Podczas używania wartości w języku powłoki musisz powiedzieć językowi, że chcesz wartość zmiennej, podczas gdy w językach skryptowych musisz powiedzieć językowi, kiedy chcesz natychmiastową wartość ciągu. Ma to wpływ, gdy jest używane interaktywnie.

W języku skryptowym, w którym ls zdefiniowano jako polecenie

a = some_value

ls a*b  

(co oznacza a? Czy to znaczy some_value * (cokolwiek to jest b) Czy masz na myśli "a' anystring 'B"?. W języku skryptowym domyślnym jest to, co jest przechowywane w pamięci dla.)

ls 'a*b'  Now means what the Unix ls a*b means.

In a Bash-like language

set a=some_value

ls a*b   means what the Unix ls a*b means.

ls $a*b  uses an explicit recall of the value of a.

Języki skryptowe ułatwiają przechowywanie i przywoływanie wartości i trudno jest mieć na wartości przejściowy zakres. Języki powłoki umożliwiają przechowywanie i przywoływanie wartości, ale mają trywialnie przejściowy zakres dla każdego polecenia.

 6
Author: rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-23 14:01:26

Zadajesz pytanie. Nie wszyscy zgadzają się, że języki powłoki są lepsze. Po pierwsze, _ Why doesn ' t

Niedawno znajomy zapytał mnie, jak rekurencyjnie przeszukiwać jego skrypty PHP pod kątem ciągu znaków. Miał wiele dużych plików binarnych i szablonów w tych katalogach, które mogły naprawdę pogrążyć zwykły grep. Nie mogłem wymyślić sposobu, aby użyć grepa, aby to się stało, więc pomyślałem, że użycie find I grep razem będzie moim najlepszym wyborem.

  find . -name "*.php" -exec grep 'search_string' {} \; -print

Oto powyższe wyszukiwanie plików przerobione w Ruby:

  Dir['**/*.php'].each do |path|
    File.open( path ) do |f|
      f.grep( /search_string/ ) do |line|
        puts path, ':', line
      end
    end
  end
Twoja pierwsza reakcja może brzmieć: "Cóż, to trochę słowniejsze niż oryginał."I po prostu muszę wzruszyć ramionami i pozwolić, by tak było. "Jest o wiele łatwiejsze do rozszerzenia", mówię. Działa na różnych platformach.
 3
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-03 11:55:47

Skalowalność i rozszerzalność? Common Lisp (można nawet uruchomić CLISP, i ewentualnie inne implementacje, jako Powłoka logowania w środowiskach UNIX).

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-01 18:43:20

Dla użytkowników windows, nie czułem jeszcze potrzeby powershell ponieważ nadal używam 4NT (teraz Przejmij kontrolę) od Jpsoft, jest to bardzo dobra powłoka z wieloma możliwościami programistycznymi. Łączy w sobie to, co najlepsze z obu światów.

Kiedy spojrzysz na NP IRB (interpreter ruby), musi być możliwe rozszerzenie go o więcej jednowierszowych, aby wykonywać codzienne Skryptowe lub masowe Zarządzanie plikami i zadania minutowe.

 2
Author: peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-11 17:39:39