Mocne strony skryptów powłoki w porównaniu z Pythonem [zamknięte]

95

Kilka razy próbowałem nauczyć się skryptów powłoki (bash), ale odepchnęła mnie składnia. Potem znalazłem Pythona i byłem w stanie zrobić większość rzeczy, które skrypt powłoki może zrobić w Pythonie. Nie jestem teraz pewien, czy powinienem więcej poświęcać czasu na naukę skryptów powłoki. Więc chcę zapytać:

Jakie są mocne strony skryptów powłoki, które sprawiają, że jest to niezastąpione narzędzie w porównaniu z Pythonem?

Nie jestem z zawodu administratorem systemu, ale interesuje mnie konfigurowanie systemów Linux dla użytkowników domowych, dlatego myślę, że nauka skryptów powłoki może być konieczna.

Amol Gawai
źródło

Odpowiedzi:

83
  • Skrypty powłoki mają prostszą notację dla przekierowania we / wy.
  • Prostsze jest tworzenie potoków z istniejących programów w powłoce.
  • Skrypty powłoki ponownie wykorzystują całe programy.
  • Shell jest powszechnie dostępny (na czymkolwiek takim jak Unix) - Python niekoniecznie jest zainstalowany.

Prawdą jest, że w Pythonie możesz zrobić wszystko, co możesz zrobić w powłoce; Prawdą jest również, że są rzeczy, które są łatwe w Pythonie, ale są trudne w powłoce (tak jak są rzeczy, które są łatwe w powłoce, ale trudne w Pythonie). Znajomość obu będzie najlepsza w dłuższej perspektywie.

Jonathan Leffler
źródło
17
1 i 2, dobre punkty. # 3 to słabość, ponieważ prowadzi do dużego obciążenia, którego Python może uniknąć. Punkt 4 może być w dużej mierze nieprawdziwy. Python jest teraz częścią większości dystrybucji Linuksa.
S.Lott
1
@Svante: napisz prostą pętlę powłoki, aby wykonać szereg operacji za pomocą poleceń, takich jak „test” i „expr”, i porównaj czasy wykonywania ze skryptem Pythona, który używa modułu „os”. Polecenia takie jak test i expr często obejmują rozwidlenie podprocesu w celu wykonania prawdziwej pracy.
S.Lott
2
Punkt 3 widzę jako ogromną zaletę, a nie wadę. Na przykład rozważ zmianę rozmiaru katalogu pełnego obrazów za pomocą programu do konwersji.
Glenn
7
W odniesieniu do punktu 4 godne uwagi jest to, że bashpowłoka nie jest powszechnie dostępna we wszystkich dystrybucjach Linuksa, w szczególności w systemach wbudowanych i innych, w których działa busyboxplik wykonywalny. Skrypty, których celem jest sama powłoka Bourne'a, z którą bashjest kompatybilna wstecz, będą działać na wszystkich systemach zgodnych z POSIX, jednak ten język jest znacznie bardziej ograniczony niż język implementowany przez bash.
intuicja
5
@intuited: eval "$ (historia 2 | głowa -1 | perl -pe 's / (? <= co jest) bardziej prawdopodobne / przynajmniej /')"; historia -d $ (historia 2 | głowa -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
intuicja
54

„Jakie są mocne strony skryptów powłoki, które sprawiają, że jest to niezbędne narzędzie w porównaniu z Pythonem?”

Muszla nie jest niezbędna. Jak myślisz, dlaczego jest ich tak wielu? bash, tcsh, csh, sh itp.,

Python to powłoka. Nie ten, którego używałbyś do uruchamiania wszystkich poleceń, ale do tworzenia skryptów jest idealny.

Python jest mniej więcej standardową częścią wszystkich dystrybucji Linuksa.

Bardziej tradycyjne muszle robią zbyt wiele rzeczy.

  1. Mają wygodny interfejs użytkownika do uruchamiania poleceń. Obejmuje to jednowierszowe polecenia, w których powłoka przeszukuje PATH, rozwidla i wykonuje żądany program. Obejmuje ona także rurociągi, sekwencji i programów współbieżnych (używając ;, |i &), jak również pewne przekierowanie (z wykorzystaniem >i <).

  2. Mają kiepską, podobną do języka programowania możliwość uruchamiania skryptów. Ten język jest raczej trudny w użyciu i wyjątkowo nieefektywny. Większość wypowiedzi w tym języku wymaga rozwidlenia jednego lub więcej dodatkowych procesów, marnowania czasu i pamięci.

Uruchamianie programów z powłoki, przekierowywanie stderr do pliku dziennika i tego typu rzeczy są dobre. Zrób to w muszli.

Prawie wszystko inne można zrobić wydajniej i wyraźniej jako skrypt w Pythonie.

Potrzebujesz obu . Jednak nigdy nie powinieneś pisać skryptu z instrukcjami if lub pętlami w tradycyjnym języku powłoki.

S.Lott
źródło
1
@intuited. A) Mnożenie się różnych muszli świadczy o liczbie cech, które tworzą „skorupkę”; nie jest to podstawowa rola, ale obejmuje wszystkie funkcje. B) Interpreter Pythona jest poprawną powłoką uniksową, używa # !. C) „Prosta” ifinstrukcja powłoki często wiąże się z uruchomieniem testprogramu. Powłoka to kiepski język programowania pod każdym względem.
S.Lott,
4
@S. Lott: Wygląda na to, że w obwodzie występuje jakiś dysonans semantyczny. Moja definicja powłoki UNIX to interpreter, którego język jest przede wszystkim nastawiony na kontrolowanie na wysokim poziomie działania systemu UNIX. Zgodnie z tą definicją, jakaś powłoka jest z pewnością niezbędna do działania systemu UNIX, a Python się nie kwalifikuje. Jak zdefiniowałbyś ten termin?
intuicyjnie
1
@ S.Lott: Nie jestem wielkim fanem składni używanej w tradycyjnych skryptach powłoki, ale uważam ją za całkiem użyteczną i odpowiednią w wielu sytuacjach, w których głównym celem jest kontrolowanie procesów i przepływu ich danych wyjściowych. Często wymaga to podejmowania decyzji i iteracji. Nowoczesne powłoki ( bashco najmniej) mają poleceń wbudowanych do obsługi procesu decyzyjnego (np testjest bashwbudowane, oprócz bardziej wszechstronny konstruktów). Z pewnością ma swoje słabości, ale i mocne strony. Warto również uczyć się szczegółowo, ponieważ jest to zupełnie inny paradygmat niż inne rodzaje języków.
intuicyjnie
1
@intuited: „znajdź to całkiem przydatne” to ukłon w stronę Twoich umiejętności, a nie kiepski język. Python może być bardziej użyteczny dla osób o mniejszych umiejętnościach.
S.Lott
3
@ S.Lott: Interesujące, masz zupełnie inną filozofię niż ja. Uważam, że projekt i operacje to w zasadzie kury i jajka. Oznacza to, że skrypt powłoki to program, który uruchamia programy. Wiele z tych programów zostało początkowo zaimplementowanych jako coraz bardziej złożone skrypty powłoki. W pewnym momencie opłaciło się, prawdopodobnie tak samo ze względu na wydajność, jak i modułowość, aby niektóre z nich zostały przepisane w C, a później w Pythonie. Na przykład: w pewnym momencie cat "$1" | ssh "$2" "cat - >\"$1\""począł scp. Wiedzieli, jak najlepiej go zaprojektować, ponieważ już go używali.
intuicja
32

Powłoka sprawia, że ​​zwykłe i proste czynności są naprawdę proste, kosztem uczynienia bardziej złożonych rzeczy znacznie bardziej skomplikowanymi.

Zwykle mały skrypt powłoki będzie krótszy i prostszy niż odpowiadający mu program w języku Python, ale program w języku Python będzie miał tendencję do łagodnego akceptowania modyfikacji, podczas gdy skrypt powłoki będzie miał tendencję do coraz mniejszego utrzymania w miarę dodawania kodu.

Skutkuje to tym, że dla optymalnej codziennej produktywności potrzebujesz skryptów powłoki, ale powinieneś używać go głównie do jednorazowych skryptów i używać Pythona wszędzie indziej.


źródło
14

Ze skryptami powłoki nie można zrobić nic, czego nie można zrobić w Pythonie. Dużą zaletą skryptów powłoki jest to, że używasz tych samych poleceń, co podczas korzystania z powłoki, więc jeśli jesteś ciężkim użytkownikiem powłoki, skrypty powłoki w pewnym momencie staną się bardzo szybkim i łatwym sposobem na zautomatyzowanie pracy powłoki .

Łatwiej mi też radzić sobie z potokami danych w skryptach powłoki niż w Pythonie, chociaż jest to absolutnie wykonalne w Pythonie.

I wreszcie, nie musisz uruchamiać dodatkowego interpetera, aby uruchomić skrypty powłoki, co daje bardzo małą, ale czasami zauważalną przewagę szybkości i wykorzystania pamięci.

Ale z drugiej strony, skrypty Pythona są o wiele łatwiejsze w utrzymaniu, próbuję migrować z dużych, brzydkich skryptów powłoki do skryptów Pythona właśnie z tego powodu. W Pythonie łatwiej jest też obsługiwać wyjątki i QA.

elzapp
źródło
9

nie trzeba uczyć się skryptów powłoki, jak wskazują wszystkie poprzednie odpowiedzi; ale uczenie się nigdy nie jest złe. to naprawdę kwestia osobistych priorytetów. komuś innemu bardzo trudno jest powiedzieć, co jest warte twojego czasu, a co nie.

większość programistów uważa, że ​​nauka nowych języków za każdym razem staje się coraz łatwiejsza. (to samo dotyczy w dużej mierze także języków naturalnych). Im wcześniej zaczniesz, tym lepiej.

plus: nauka języka pozwala ekstrawagancko oddzielić jego ograniczenia od pozycji pełnej wiedzy i znajomości języka. to prawdopodobnie nie zapewni ci wyluzowania, ale może przynieść ci piwo od rówieśników!

adrianrf
źródło
8

Zgadzam się z większością poprzednich odpowiedzi. Uważam, że polecenia powłoki najlepiej nadają się do wykonywania zadań zorientowanych na system plików (kopiowanie i przenoszenie plików, grep itp.). Moim zdaniem powłoka jest lepsza, jeśli musisz czytać i zapisywać do pliku, ponieważ pojedyncze >>file.txtprzekierowanie dołącza się natychmiast do pliku, zamiast np.file=open('file.txt','a'); file.write() .

Obecnie do użytku osobistego mieszam oba, tworząc skrypt Pythona i wywołując os.system ('command') lub os.popen ('command') za każdym razem, gdy jakaś akcja jest łatwiejsza w powłoce niż w Pythonie.

heltonbiker
źródło
6

Powłoka jest dostępna wszędzie. Jeśli trzymasz się stosunkowo podstawowego zestawu funkcji przenośnych, twoje skrypty mogą działać na telefonach komórkowych, routerach bezprzewodowych, rejestratorach DVR, netbookach, stacjach roboczych, dużych żelaznych serwerach i tym podobnych. Python niekoniecznie jest dołączany po wyjęciu z pudełka w wielu systemach, aw zależności od środowiska może być trudno go zainstalować.

Zapoznanie się ze skryptami powłoki może również pomóc w nauce trików z wiersza poleceń, ponieważ wiersz poleceń jest, cóż, powłoką. Przydaje się również do zrobienia dość długiego i skomplikowanego wiersza poleceń i przekształcenia go w bardziej ogólny skrypt, gdy zdasz sobie sprawę, że będziesz go potrzebować bardziej.

Powłoka ma również kilka całkiem potężnych funkcji; potoki są naprawdę interesującą konstrukcją sterującą, która jest natywna tylko dla powłoki, o ile wiem.

Brian Campbell
źródło
5

Kolejną rzeczą do rozważenia przy wyborze skryptów powłoki Pythona jest wersja Pythona, która będzie działać na maszynach docelowych. RHEL5 (żeby wymienić jeden) będzie dostępny przez długi czas. RHEL5 utknął w Pythonie 2.4. Istnieje wiele fajnych bibliotek, które zależą od funkcjonalności dodanej do Pythona po wersji 2.4.

nscott
źródło