Do tej pory robiliśmy wszystkie skrypty z Bash, ale zaczynam czuć się trochę głupio z tego powodu. Chociaż możemy oczywiście robić wszystko, co chcemy z Bash (jest dość potężny), zaczynam się zastanawiać, czy zamiast tego nie powinniśmy używać odpowiedniego języka skryptowego (w naszym przypadku najprawdopodobniej Ruby).
Jak decydujesz, kiedy używać skryptu w Perlu / Pythonie / Ruby w Bash? Nie sądzę, aby skrypt inicjujący z Ruby miał sens, ale co powiesz na nieco dłuższy skrypt, który dodaje konta e-mail?
Odpowiedzi:
Biorąc pod uwagę problem, z którym obaj mogą sobie poradzić, będziesz chciał użyć tego, z którym czujesz się najlepiej. Ostatecznie istnieje wiele drobnych szczegółów, a tylko doświadczenie może ich nauczyć.
Bash jest językiem skryptowym ogólnego przeznaczenia, takim jak Python, Ruby, Perl, ale każdy z nich ma inne mocne strony niż reszta. Perl przoduje w analizie tekstu, Python twierdzi, że jest najbardziej elegancki ze wszystkich, skrypty Bash doskonale nadają się do „przesuwania rzeczy”, jeśli wiesz, co mam na myśli, a Ruby ... cóż, Ruby jest trochę wyjątkowa sposobów.
Jednak różnice między nimi naprawdę mają znaczenie tylko wtedy, gdy masz wystarczająco dużo doświadczenia w pisaniu skryptów. Sugeruję wybranie jednego języka i przesunięcie go do granic możliwości przed przejściem do następnego. Możesz zrobić wiele w skrypcie powłoki, więcej niż większość ludzi przyzna. Każdy język jest tak trudny, jak chcesz. Po napisaniu kilku rzeczy, każdy język jest dla ciebie „łatwy”.
Znajomość powłoki szybko się opłaca, jeśli mieszkasz w Linuksie, więc może chcesz zacząć od tego. Jeśli znajdziesz zadanie, którego wykonanie w skrypcie powłoki jest niemożliwe lub niepraktyczne, użyj czegoś innego.
Pamiętaj też, że nauka skryptów powłoki jest bardzo prosta. Prawdziwa moc tego leży w innych programach, takich jak awk, sed, tr i in.
źródło
TL; DR - używaj bash tylko do instalowania lepszego języka (jeśli nie jest już dostępny), w przeciwnym razie marnujesz nieoceniony, cenny ludzki czas. Jeśli nie możesz tego zrobić ręcznie w wierszu poleceń bez błędów, nie pisz w bash / shell.
Jest 2015, więc rozważę następujące kwestie:
narzut pamięci
czas uruchomienia
występ
wydajność
Uważam, że nie ma powodu, aby używać Bash / Shell, jeśli masz zainstalowany Ruby / Python.
I prawdopodobnie zainstalowanie Ruby / Pythona nawet nie potrzebuje skryptu bash w pierwszej kolejności (z wyjątkiem busyboksa, niektóre narzędzia systemowe zależą od obecności Pythona / Perla).
I za każdym razem, gdy piszesz skrypt powłoki, „ćwiczysz”, robiąc dokładnie to - zamiast uczyć się czegoś mocniejszego / wydajniejszego.
Dlaczego ludzie korzystają obecnie z Bash? Ponieważ jest to okropny, trudny do złamania nawyk. Skrypt rzadko jest „kończony na zawsze” po pierwszych kilku minutach - bez względu na to, jak silnie ludzie myślą w ten sposób. Wraz z błędem „to ostatni błąd w tym skrypcie”.
Wniosek: używaj bash / shell tylko wtedy, gdy jesteś absolutnie do tego zmuszony (np.
~/.bashrc
Busybox), ponieważ w dzisiejszych czasach prawie nigdy nie jest to „odpowiednie narzędzie do pracy”.źródło
Korzystam z bash, gdy główny nacisk kładę na obsługę plików. Może to obejmować przenoszenie, kopiowanie i zmianę nazw plików, a także wykorzystywanie plików jako danych wejściowych dla innych programów lub przechowywanie wyników innych programów w plikach. Rzadko piszę kod bash, który faktycznie sprawdza zawartość pliku lub generuje dane wyjściowe do zapisu do pliku; Pozostawiam to innym programom (które mogę pisać w Perlu lub Pythonie), które uruchamiam przez bash.
Używam Perla i Pythona, kiedy moim głównym celem jest odczytywanie danych z plików, przetwarzanie tych danych w jakiś sposób i zapisywanie danych wyjściowych w plikach. Jeśli okaże się,
system
żesubprocess
zbyt często używam (w Perlu) polecenia, zaznacza wstecz lub (w pythonie) moduł, rozważam napisanie skryptu w bash. Z drugiej strony czasami zaczynam dodawać tak wiele funkcji do skryptu bash, że ostatecznie sensowniej jest przepisać go w Perl / python, zamiast zajmować się ograniczoną (przez porównanie) obsługą bash dla zakresu zmiennych, funkcji, struktur danych itp. .źródło
=~
operatorem wspieranym przeze[[ ]]
mnieLubię kryteria określone w tym poście na blogu .
źródło
Uważam, że ta analiza Perla kontra Basha jest przydatna ...
http://blogs.perl.org/users/buddy_burden/2012/04/perl-vs-shell-scripts.html
Dla wygody kopiuję streszczenie tego autora 1) kiedy bash jest lepszym odkryciem i 2) kiedy perl jest lepszym wnioskiem ...
Kiedy Bash jest lepszy ...
Kiedy Perl jest lepszy ...
źródło
fail "error" unless system("foobar")
).Z mojego doświadczenia wynika, że bash kontra python to kompromis między czasem programowania a elastycznością. Podstawowe rozwiązanie problemu można zwykle ustalić w skrypcie bash szybciej niż w skrypcie python.
Python sprawi, że będziesz myślał bardziej o strukturze swojego rozwiązania niż o równoważnym skrypcie bash. Python ma bardziej ekspresyjną moc niż skrypt bash, więc z czasem lepiej się skaluje i modyfikuje. Jest również ogólnie bardziej czytelny.
Bash jest bliższy systemowi plików i może być świetny do pierwszego rozwiązania problemów, które NIE są dobrze zdefiniowane. Z tego powodu skrypt bash może być dobrym pierwszym wyborem do prototypowania czegoś z pełną intencją przeniesienia go do Pythona, gdy problem zostanie lepiej zrozumiany.
źródło
Bash jest powłoką uniksową, zawiera język skryptowy. Jest to raczej procesor poleceń. kontrolujesz sposób uruchamiania poleceń, faktycznie je uruchamiasz.
Perl / Ruby / Python to języki ogólnego przeznaczenia.
Kiedy potrzebujesz skryptu powłoki, używasz Bash
Jeśli chcesz bardziej złożone zadanie lub nie jest ono związane z powłoką. Użyj Python itp.
Nigdy nie porównałbym tych języków. Python itp. Są przenośne. Możesz je uruchomić w dowolnym miejscu. Bash jest tylko dla Uniksa.
Python itp. Ma mnóstwo bibliotek wielokrotnego użytku rozwiązujących miliony zadań.
To prawie to samo, jeśli pytasz. „Kiedy używać Paint, a kiedy Photoshop”
Do przetwarzania e-maili ponownie użyłbym Ruby, ponieważ ma wiele bibliotek wielokrotnego użytku.
Ale najlepszym sposobem byłoby połączenie bashu i rubinu. Tak by było. Podobnie jak w przypadku tworzenia skryptu przetwarzania wiadomości e-mail w skrypcie ruby, skrypt bash wywoła ten skrypt ruby i uruchomi inne komendy ds.
Więc kiedy potrzebujesz procesora poleceń, używasz bash. Uruchamiasz polecenia Unix i kontrolujesz je.
AKTUALIZACJA po 7 latach (marzec 2019)
Chociaż główna część mojej odpowiedzi nie uległa zmianie, chciałbym to podkreślić.
Bash jest również potężnym językiem skryptowym. W przypadku przetwarzania tekstu może to być absolutnie uzasadniony wybór.
Przeczytaj komentarze mkaito poniżej. Wszystkie są całkowicie prawdziwe.
źródło
Skrypty powłoki, takie jak bash, ksh, zsh, sh i fish, są niezwykle zaskakujące w porównaniu do języków ogólnego przeznaczenia wysokiego poziomu, takich jak Ruby, Python lub Perl. Podczas gdy skrypt powłoki może zacząć działać jako plik krótszy niż równoważny skrypt ogólnego przeznaczenia, niespodzianki prowadzą do wielu defensywnych kodów opakowaniowych, takich jak
set -euo pipefail
włączenie trybów ścisłych.Na przykład większość języków powłoki kontynuuje wykonywanie wierszy w skrypcie powłoki, nawet jeśli jedno z poleceń nie powiedzie się. Natomiast język ogólnego przeznaczenia natychmiast zawiesza się przy pierwszym błędzie i często jest obciążony, co skutkuje bezpieczniejszym, bardziej przewidywalnym zachowaniem w skryptach o nawet niewielkiej złożoności.
źródło
Bardzo stronniczy artykuł.
Nie uważam, żeby bash był tak trudny do debugowania. Python jest często zbyt sztywny, a bash pozwala być bardzo kreatywnym. Jeśli jesteś dobrym, nieszablonowym myślicielem, spodoba ci się bash.
Uruchamiam skrypty bash na milionach odczytów sekwencjonowania DNA w tysiącach plików, i to mi w porządku. I w przeciwieństwie do tego, co wszyscy mówią, te same wersje skryptów w C ++ nie działają tak dużo szybciej (po kilku minutach oddzielają je).
Myślę, że bash, podobnie jak perl, nie jest najbardziej przyjazny dla użytkownika / łatwy do odczytania. To odstrasza ludzi, ponieważ większość ludzi nie jest wielkimi myślicielami abstrakcyjnymi. Ale jaśniejsi, bardziej kreatywni programiści lubią to i często z niej korzystają. Jeśli znasz siebie i wiesz, że masz mózg, nie bój się bash. Jeśli jesteś podstawowym myślicielem, może trzymaj się czegoś takiego jak Python. Do każdego własnego.
źródło
Z „Lamy Book”
źródło
Zasadniczo używaj najprostszego języka, który ma wystarczającą wydajność do wykonania zadania. A jego szczególne cechy tylko w takim stopniu, że są naprawdę przydatne.
A jeśli chodzi o czytelność, Bash jest okropny, jeśli twój styl programowania jest okropny. Jeśli po prostu rzucisz tam kod, staje się on niejasny.
Ale jeśli podzielisz kod na najkrótsze funkcje i nazwiesz rzeczy w prosty, zrozumiały sposób, będzie to najczystszy język, jaki możesz znaleźć. Ponieważ to jest bardzo zwięzłe.
Jak na przykład jest to mój najnowszy kod w Bash. Zauważ, jak łatwo to zrozumieć i wpisać:
źródło