Jaka jest przewaga skryptu powłoki nad interpretowanymi językami programowania? [Zamknięte]

15

(Nie jestem pewien, czy jest to właściwe pytanie tutaj)

Skrypty powłoki, podobnie jak te napisane bash, mogą robić wiele rzeczy. Mogą wywoływać programy uniksowe, przesyłać dane wyjściowe, przekierowywać wejścia / wyjścia z / do plików, kontrolować przepływ, sprawdzać, czy plik istnieje itp.

Ale nowoczesny język programowania, na przykład, pythoni rubymoże również robić te rzeczy. I są one (myślę) bardziej czytelne i łatwe w utrzymaniu.

bashcieszy się szerokim zainteresowaniem. Ale wiele dystrybucji ma również zainstalowany pythoninterpreter.

Jaka jest więc zaleta skryptu? Gdybym mógł pisać python, rubyczy perlwarto się uczyć bash?

Lai Yu-Hsuan
źródło
3
Jeśli dużo pracujesz z systemami uniksowymi, powinieneś nauczyć się bash, a także innych popularnych powłok uniksowych.
Bernard

Odpowiedzi:

30

Powłoki mają wyspecjalizowane funkcje do pracy z plikami i przenoszenia danych z jednego programu do drugiego (przy założeniu, że dane są tekstem). Do tych zadań skrypty powłoki mogą być mniej kłopotliwe niż język skryptowy, taki jak Python.

Zaletą skryptu powłoki jest to, że używane polecenia są w zasadzie tymi samymi poleceniami, których używasz z wiersza poleceń - więc jeśli możesz coś zrobić w powłoce, jesteś w połowie drogi do skryptu tej samej operacji.

Oto na przykład skrypt bash, który przenosi wszystkie pliki PNG z bieżącego katalogu do określonego katalogu.

#!/usr/bin/sh
mv *.png $1

Oto wersja Python.

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

Zauważysz:

  • Skrypt bash jest trzeci tak długo, jak Python, jeśli policzysz linie (z wyłączeniem linii shebang) - jeszcze mniej według liczby znaków
  • Skrypt Pythona wymaga zaimportowania trzech bibliotek, a wszystko, czego potrzebujesz do tego zadania, jest natywnie dostępne w bash
  • Skrypt Pythona wymaga jawnej pętli do przenoszenia plików, podczas gdy jest to część semantyki mvpolecenia w bash
  • Skrypt bash może działać szybciej - prawdopodobnie wywołasz go z bash i możesz go użyć sourcew tym samym wystąpieniu powłoki
  • glob.iglob("./*.png") to całkiem kęs *.png

Jeśli chciałbyś napisać podstawową operację na potoku w Pythonie, byłbyś zaskoczony gadatliwością. (Oczywiście niektóre rzeczy, takie jak przesyłanie strumieniowe grep, można zastąpić kodem w języku Python zamiast używać zewnętrznego programu, więc często nie trzeba tak dużo przesyłać strumieniowo.)

Jako kontrprzykład musiałem kiedyś napisać procedurę sprawdzającą, jak długo każda z nazw plików znajduje się w określonym katalogu. Jeśli były dłuższe niż obsługiwane przez określony system operacyjny, musiały zostać skrócone. Może to spowodować zduplikowanie nazw plików, które musiałem skorygować, a ponieważ byłyby linkowane ze strony internetowej, skrócone nazwy musiały być stabilne, tj. Powinny być generowane w taki sposób, aby ta sama długa nazwa pliku zawsze skutkowała ta sama skrócona nazwa pliku. Zrobiłem to, generując szesnastkową md5 długiej nazwy pliku i dodając pierwsze cztery znaki do skróconej nazwy (nazwy nadal mogą się kolidować, ale było to bardzo niejednoznaczne, więc po prostu sprawdziłem ten warunek i zapłaciłem kaucję, jeśli tak się stanie) .

Zrobiłem to w bash, ponieważ był on częścią naszego systemu kompilacji, który był już napisany w bash. Dokładnie tak trudno było sobie wyobrazić. Pisanie w Pythonie zajęłoby o wiele mniej czasu i zapewne też byłoby jaśniejsze.

W skrócie: różne języki są zaprojektowane do różnych rodzajów zadań; wybierz dostępny język, który najlepiej odpowiada wykonywanemu zadaniu.

kindall
źródło
Nie możesz zrobić tego samego w perl # / usr / bin / perl mv *.png $1(komentarze nie zachowują formatowania), ale w perlu możesz również używać funkcji języka wyższego poziomu.
Poma,
19

Istniejące odpowiedzi są również poprawne, ale jest jeden powód, o którym nikt jeszcze nie wspomniał: ponieważ BĘDZIE tam.

Każda podana instalacja * nix jest wykonywana przy użyciu zestawu opcjonalnych pakietów, które mogą zostać załadowane lub nie, i nie wszystkie systemy będą miały Python, Perl lub Ruby. Ale jeśli oczekuje się, że system będzie miał jakąkolwiek zdolność interaktywną, będzie miał powłokę. Oznacza to, że skrypty powłoki będą działać w systemach od serwerów, przez komputery programistów, przez sekretarskie komputery typu cienki klient, aż po urządzenia osadzone, w każdym systemie, który obsługuje zapisywalny system plików i wiersz poleceń bash.

Dla kogoś, kto pracuje tylko w spójnym środowisku serwerowym, jest to coś, co można uznać za coś oczywistego i nie jest tak ważne. Dla kogoś pracującego w bardziej zróżnicowanym środowisku nie należy tego lekceważyć.

Erik Johnson
źródło
9

Odpowiedź na znaczną część twojego pytania:

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

Oto fragment mojej odpowiedzi na to pytanie :

Jest kilka różnic, o których mogę myśleć; po prostu pomyślałem tutaj, w żadnej kolejności:

  1. Python i spółka są zaprojektowane tak, aby były dobre w skryptowaniu. Bash & Co. mają być tylko dobry w skryptach, absolutnie bez kompromisów. IOW: Python został zaprojektowany tak, aby był dobry zarówno w skryptach, jak i poza skryptami, Bash dba tylko o skrypty.

  2. Bash & Co. są bez typu, Python & Co. są mocno wpisane, co oznacza, że ​​liczba 123, ciąg 123i plik 123są zupełnie inne. Nie są one jednak wpisywane statycznie , co oznacza, że ​​muszą mieć dla nich różne literały, aby je rozdzielić. Przykład:

    • Ruby: 123(liczba), Bash:123
    • Ruby: '123'(ciąg), Bash:123
    • Ruby: /123/(wyrażenie regularne), Bash:123
    • Ruby: File.open('123')(plik), Bash:123
    • Ruby: IO.open('123')(deskryptor pliku), Bash:123
    • Ruby: URI.parse('123')(URI), Bash:123
    • Ruby: `123`(polecenie), Bash:123
  3. Python & Co. przeznaczone są do skalowania w górę do 10000, 100000, może nawet 1000000 programy liniowe, Bash & Co. przeznaczone są do skalowania w dół do 10 znaków programów.

  4. W Bash & Co. pliki, katalogi, deskryptory plików, procesy są obiektami najwyższej klasy, w Pythonie tylko obiekty Python są najwyższej klasy, jeśli chcesz manipulować plikami, katalogami itp., Musisz je owinąć w Najpierw obiekt Python.

  5. Programowanie powłoki to zasadniczo programowanie przepływu danych. Nikt nie zdaje sobie z tego 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 przepływ danych wydaje się być postrzegany głównie jako model współbieżności, a nie paradygmat programowania.

Mam wrażenie, że próba rozwiązania tych kwestii poprzez połączenie funkcji lub DSL z językiem programowania ogólnego przeznaczenia nie działa. Przynajmniej nie widziałem jeszcze przekonującego wdrożenia. Istnieje RuSH (Ruby shell), który próbuje zaimplementować powłokę w Ruby, istnieje pośpiech, który jest wewnętrznym DSL do programowania powłoki w Ruby, jest Hotwire, który jest powłoką Pythona, ale IMO żaden z nich nie jest nawet blisko konkurować z Bash, Zsh, rybami i przyjaciółmi.

Jörg W Mittag
źródło
Broken Link: Gdzie jest to pytanie (i odpowiedź), do którego się teraz odnosisz? A może skopiowano wszystko, co było przydatne?
Wolf
1
@Wolf: Wygląda na to, że po prawie trzech latach został usunięty, ponieważ jest nie na temat. To niefortunne.
Jörg W Mittag
1
Oto zarchiwizowana wersja tego pytania: web.archive.org/web/20140528035940/http://stackoverflow.com/…
waldyrious
1

Powiedziałbym, że skrypt powłoki ma tę przewagę w sytuacjach, w których chcesz po prostu wykonać super-proste, zautomatyzowane zadanie. Na przykład, jeśli chcesz napisać skrypt, który tworzy kopię zapasową katalogu z jednego serwera na drugi każdego dnia o 5:00, używanie zbyt mocnego języka programowania byłoby przesadą.

Z drugiej strony, jeśli twoje zadanie programistyczne wymaga bardziej struktur kontrolnych (if / then / else), iteracyjnych (pętla), baz danych i plików we / wy itp., To prawdopodobnie lepiej nadaje się dla bardziej zdolnych język programowania niż skrypt powłoki.

Myślę, że dobrą zasadą jest:

automatingSimpleTask ? shellScript() : programmingLanguage();
CFL_Jeff
źródło
2
Nie powinno to być shellScript() if automatingSimpleTask else programmingLanguage() lol.
gahooa
1
@ gahooa haha ​​pokazuje, po której stronie ogrodzenia jestem!
CFL_Jeff
1

Chociaż możesz uruchamiać programy z programu python / ruby ​​/ cokolwiek innego, w powłoce jest inaczej. Może być konieczne użycie interfejsu API, aby coś uruchomić - na przykład fork (). W skrypcie powłoki programy zachowują się bardziej jak funkcje w tradycyjnym języku programowania i mogą być uruchamiane, przesyłane strumieniowo itp. Przy minimalnym wysiłku. Przepływ danych jest również bardzo wyraźny przy użyciu rur.

phkahler
źródło
0

Jeśli masz całkowitą swobodę wyboru języka programowania używanego do niektórych zadań, prawdopodobnie prawie całkowicie unikniesz nauki bash i wykonasz każde zadanie programowania skryptowego za pomocą Perla, Pythona lub Ruby. Może to czasem prowadzić do bardziej szczegółowego rozwiązania, szczególnie w przypadku, gdy potrzebujesz tylko skryptu wywołującego sekwencję innych narzędzi uniksowych, ale w bardziej skomplikowanych przypadkach masz rację, te nowoczesne języki skryptowe dają więcej możliwości pisania lepiej utrzymywalnego kodu (dają też więcej możliwości pisania zaciemnionego kodu, ale to twój wybór).

Z drugiej strony często nie jesteśmy w stanie wybrać języka, który najbardziej nam się podoba, ponieważ musimy pracować ze starszym kodem lub kodem napisanym przez kogoś, kto znał bash, ale nie znał żadnego z wymienionych przez ciebie języków skryptowych.

Doktor Brown
źródło
0

Skrypty powłoki to interpretowany język programowania. Oto kilka powodów, dla których zdecydowałem się pisać skrypty bash zamiast perla, pytona lub innego języka skryptowego:

Działa wszędzie : bardziej złożone interpretatory mogą nie zawsze być dostępne, na przykład podczas uruchamiania systemu lub systemów wbudowanych. Bash jest dostępny nawet w busyboksie.

Działa w wierszu poleceń : jeśli jesteś dobrze zaznajomiony ze skryptami powłoki, możesz wykorzystać te umiejętności do robienia złożonych rzeczy w skryptach ad-hoc bezpośrednio w wierszu poleceń. Używam tej umiejętności codziennie jako administrator.

Łatwiejsze pisanie programów wywołujących inne programy: Jeśli próbujesz połączyć kilka istniejących programów w interesujący sposób, łatwiej jest to zrobić w skrypcie powłoki niż w języku wyższego poziomu.

Jeśli program ma 30 wierszy lub mniej, zwykle piszę go za pomocą skryptów powłoki. Jeśli masz do czynienia ze złożoną manipulacją, kompleksem lub analizą, zrobię to używając Pythona lub Perla.

tylerl
źródło
-1

Powinieneś spojrzeć na coffeescript. Ich słowa:

Pod tymi wszystkimi niezręcznymi nawiasami klamrowymi i średnikami JavaScript zawsze miał w sercu wspaniały model obiektu. CoffeeScript to próba ujawnienia dobrych części JavaScript w prosty sposób.

Złota zasada CoffeeScript to: „To tylko JavaScript”.

Cóż ... oto odpowiedź dla początkujących.

Jako początkujący uczący się przez ostatnie 6 miesięcy, w ostatnich dniach próbujący trochę C, C ++, Javascript i więcej Bashscript ... Mogę ci powiedzieć:

Skrypty powłoki, podobnie jak te napisane bash, mogą robić wiele rzeczy. Mogą wywoływać programy uniksowe, przesyłać dane wyjściowe, przekierowywać wejścia / wyjścia z / do plików, kontrolować przepływ, sprawdzać, czy plik istnieje itp.

i czyż nie jest to po prostu fantastyczne! ? pętle i zmienne? łał!

Python i Ruby, mogą również robić te rzeczy. I są one (myślę) bardziej czytelne i łatwe do utrzymania.

Powiedz mi, gdzie to widzisz? Napisałem bashscript w gedit nawet w geany i mogę formatować (tabulatory?) I czytam mój kod z prędkością światła, używając bashscript w porównaniu do innych języków.

Czy te języki mają inne narzędzia do utrzymania porządku? Wiem, że obiektowe oszczędza DUŻO kodu, ale ... ludzie mówią, że bashscript to także OO! WOW 2! To jest mój punkt tutaj. Zamierzam:

zaletą powłoki skrypt

kryje się w tym pytaniu: jak zrobić to bzdury w Perlu, Phytonie lub Rubinie ? To jest łatwe?

( bashdamnthing = xdotool )

H_7
źródło
WTF tu się dzieje? To jak odpowiedź doża ...
naught101