Najbardziej uniwersalnym językiem skryptowym dla systemu Linux jest?

24

Piszemy skrypty dla systemów Linux, toczyła się debata na temat tego, który byłby najbardziej uniwersalnym językiem skryptowym dla Linuksa. Bash, SH, Posix? Co?

Gilles „SO- przestań być zły”
źródło
3
Zgaduję sh.
Blender
Czy masz listę docelowych dystrybucji? Lub obowiązkowe / pożądane dystrybucje, na których musi działać?
4
„sh”? Co „sh”? Powłoka Thomsona? muszla Bourne'a? bash, ksh, pdksh, ash, zsh jak znaleziono /bin/shw systemie X czy Y ? Specyfikacja POSIX sh, specyfikacja SUSv3, SUSv4 sh, specyfikacja sh LSB? „sh” samo w sobie nic nie znaczy.
Stéphane Chazelas,
1
jeśli dotyczy to kompilacji oprogramowania i instalowania skryptów, warto wypróbować narzędzia Autotools, które próbują rozwiązać problemy z kompilacją między systemami.
Lie Ryan,
1
@sch Najbardziej przenośne wspólne skrzyżowanie, „oczywiście”. W przypadku, gdy ludzie nie znający powłok Unix zostaną wprowadzeni w błąd przez twój komentarz, specyfikacja POSIX jest implementowana przez prawie wszystkie współczesne powłoki, które odważą się na tę nazwę sh, a niezgodne sh, które nie są starożytne i rzadkie w dzisiejszych czasach (np. Bourne). Można zrzucić coraz większą listę rozszerzeń i odmian, ale jeśli celem jest „uniwersalność” lub przenośność, należy iść w przeciwnym kierunku. Odpowiedź Gillesa obejmuje szczegóły bardziej szczegółowo.
jw013,

Odpowiedzi:

38

Istnieją dwa środowiska programistyczne, które są dostępne w każdym systemie operacyjnym podobnym do Uniksa, które są pełne Turinga i mogą wywoływać inne programy: awk i sh , rodzina powłok Bourne / POSIX. AWK jest zorientowany na przetwarzanie tekstu (uzupełnia bardziej wyspecjalizowane narzędzia), podczas gdy sh jest zorientowany na bycie językiem kleju do łączenia programów. Sh jest uniwersalnym językiem skryptowym na Linuksie i na całym świecie UNIX.

Standard POSIX określa obowiązkowe funkcje samego sh i powiązanych narzędzi. Większość systemów uniksowych jest zgodnych z POSIX 1003.1-2004 (aka Single Unix v3, aka Open Group Base Specification nr 6); najnowszą wersją tego standardu jest POSIX 1003.1-2008 (aka Single Unix v4, aka Open Group Base Specification Issue 7).

Każdy Linux i Unix lub system uniksowy ma na ścieżce powłokę w stylu Bourne'a /bin/sh, a każdy nie-antyczny system ma powłokę zgodną z POSIX (z wyjątkiem sporadycznych błędów). Każdy nowoczesny system uniksowy (w tym Linux) obsługuje shebangi , więc automatycznie uruchamia skrypty, /bin/shjeśli pierwsza linia jest #!/bin/sh. Istnieją systemy POSIX, w których shznajduje się w innym miejscu (zwykle warstwy emulacji w systemach operacyjnych, których nie można by uznać za naprawdę uniksowe).

Wbudowane systemy Linux mogą mieć uproszczony system BusyBox , który nie implementuje wszystkich funkcji POSIX. BusyBox ma wiele opcji czasu kompilacji, aby pomieścić systemy o niewielkich rozmiarach, więc trudno jest z góry wiedzieć, czego się spodziewać, musisz dostosować swoje skrypty do konkretnego urządzenia. BusyBox to najczęstsza implementacja sh i różnorodnych narzędzi; innym, z którym możesz się spotkać, jest ekstremalnie ograniczone środowisko powłoki w Androidzie (późniejsze wersje są mniej anemiczne).

Dla wbudowanych systemów Linux prawie zawsze mają albo myślnik lub bash jako /bin/sh. Dash jest małą i szybką powłoką, która implementuje niewiele więcej niż funkcje POSIX. Bash to większa powłoka z większą liczbą funkcji.

W przypadku niewbudowanych systemów Linux prawie zawsze Bash jest zainstalowany jako /bin/bash. Stąd, dla przenośności na niewbudowanych systemach Linux, możesz założyć, że bash jest dostępny. Wśród przydatnych dodatkowych funkcji bash są tablice, możliwość wygodnego radzenia sobie z plikami kropkowymi, pipestatuszmienna umożliwiająca uzyskanie statusu zwracania wszystkich poleceń w potoku, dodatkowe operatory porównania czasów plików oraz (w najnowszych wersjach) dopasowanie wyrażeń regularnych .

Jedną z cech programowania powłoki jest to, że nie tylko używasz shprogramu, ale także używasz wielu narzędzi . Większość narzędzi do manipulacji plikami i przetwarzania tekstu w systemie Linux to jądra GNU (w systemach wbudowanych są one zwykle z BusyBox).

Jeśli potrzebujesz przenośności poza Linuksem, najlepiej jest trzymać się POSIX. Inne warianty uniksowe mogą nie mieć zainstalowanego basha (bash jest częścią standardowej instalacji w OSX, ale opcjonalny pakiet w * BSD i większości komercyjnych unikatów). Prawie wszystkie warianty uniksowe inne niż Linux i OSX (tj. * BSD i komercyjne jednorożce) mają pewną wersję powłoki Korna , przynajmniej pdksh . Wiele wygodnych rozszerzeń bash pochodzi z ksh, więc może być użyteczne pisanie skryptów, które mogą działać w obu systemach, ale wykrycie, gdzie bash lub ksh znajduje się w nieznanym systemie, może być trochę uciążliwe.

Powłoka nie może zrobić wszystkiego. Jeśli potrzebujesz bardziej wyrafinowanego języka, dwie bardziej popularne opcje to Perl i Python (wszystko inne jest daleko w tyle za językiem skryptowym unix). Perl jest tradycyjnym językiem skryptowym i brakuje go w kilku niewbudowanych systemach Linux, ale Python zyskuje na popularności (częściowo wzmocniony przez to, że jest zalecanym językiem skryptowym dla Ubuntu). W świecie innym niż Linux Perl jest częścią podstawowej instalacji na OSX i OpenBSD; jest opcjonalny, ale bardzo często instalowany na FreeBSD i opcjonalny, ale często instalowany na NetBSD.

Gilles „SO- przestań być zły”
źródło
1
„częściowo wzmocnione przez…” To i jest prawie wymagane w systemach Fedora i RHEL.
Ignacio Vazquez-Abrams
W większości się z tym zgadzają. Tylko kilka różnych aspektów: * niektóre dystrybucje są oparte na BusyBox, ale niekoniecznie są osadzone (używam jednego, Alpine). (To prawda, że odpowiedź nie powiedzieć „prawie zawsze”.) * BSD duża klasa uniksowych systemach, w których nie można zakładać bash domyślnie. * dash może zrobić prawie wszystko, co potrafi bash, czasami po prostu wymaga więcej uwagi. * Jeśli potrzebujesz bardziej wyrafinowanego języka, tak Perl i Python są najczęstszymi opcjami, ale awk jest jeszcze bardziej wszechobecny i jest odpowiedni do wielu celów. Jest to również często niedoceniane. Ale jest lżejszy niż Perl i Python.
dubiousjim
2
Ostre ostrzeżenie - FreeBSD usunęło Perla z domyślnej instalacji jakiś czas temu. Poza tym nie znam żadnej innej dystrybucji, która nie ma Perla w podstawowej instalacji.
TC1
@ TC1 Perl był zawsze opcjonalny na NetBSD. Jest w systemie podstawowym na OpenBSD.
Gilles „SO- przestań być zły”
@dubiousjim Tylko Linux (niewbudowany lub wystarczająco dobre przybliżenie w praktyce) i OSX mają bash w domyślnej instalacji; * BSD ma pdksh lub mksh, a komercyjne jednorożce mają ATT ksh.
Gilles „SO- przestań być zły”
11

W kolejności dostępności:

  1. sh, ale trzymaj się urządzeń określonych przez POSIX.
  2. bash, ale nie zapomnij podać go wprost w shebang, w przeciwnym razie możesz dostać myślnik.
  3. Pyton. Prawie wszyscy go używają.
  4. Perl Ale musisz to napisać.

Potem już nikogo to nie obchodzi, ponieważ niewiele można zrobić tylko z tymi.

Ignacio Vazquez-Abrams
źródło
10
Umieściłbym PERL przed Pythonem, jest on domyślnie instalowany w większości systemów Linux.
terdon
4
Perl jest # 3. I musisz to napisać, bonus! :)
Warren Young,
2
Zgadzam się z @ignacio perl jest # 4, a python jest # 3. Powód jest oczywisty. Myślę, że Python jest ewolucją perla.
bagavadhar
5
@ashwin: nie, python nie jest ewolucją, a nawet podobnym, perla. perl to język sysadmins dla sysadmins. python jest językiem programistów dla programistów. Ta różnica jest kluczowa. Oba mają swoje zastosowania i chociaż w przypadkach użycia może zachodzić wiele nakładań, dla niektórych zadań perl jest lepszym wyborem, a dla innych Python jest wyraźnie lepszy.
cas
1
Ruby i PHP zostały zainspirowane przez Perla. Python jest wynikiem eksperymentu fizyki, w którym stworzyli anty-Perlowie w supergrupce. (Nie mam nic przeciwko Pythonowi. Plusy i minusy, plusy i minusy.)
Warren Young,
4

Zwykle powiedziałbym sh... ale skoro określiłeś Linuksa, powiem bash- na pewno będzie on dostępny na każdym systemie Linux (cóż, z wyłączeniem mało znanych pedantycznie małych, które fetyzują minimalizm :).

Jeśli nie musisz przejmować się przenośnością inną niż Linux (i nie musisz uruchamiać się na małych dystrybucjach lub na wbudowanych urządzeniach Linux, takich jak routery z plastikowymi skrzynkami), możesz również skorzystać ze znacznych ulepszeń, które oferuje ponad zwykły sh. W przeciwnym razie użyj sh.

Po bash(i sh), następne najbardziej „uniwersalny” język skryptowy dla Linux byłby jakiś dialekt awk- zazwyczaj albo mawkalbo gawk. Jeśli trzymasz się zwykłego awk i unikasz gawkism, skrypt powinien działać poprawnie na prawie każdym systemie Linux (może brakować go na małych dystrybucjach lub urządzeniach osadzonych). Większość systemów Linux będzie miała oba te elementy mawki będzie gawkdostępna, ale na niektórych dystrybucjach (na przykład debian) mawkjest instalowana domyślnie i gawkjeśli chcesz, musisz ją zainstalować samodzielnie.

Dalej byłoby perl. AFAIK, podstawowy język perla jest domyślnie instalowany na wszystkich popularnych dystrybucjach Linuksa, więc jest to dobry wybór. Co więcej, na szczęście jest bardzo mało niekompatybilności wersji z wydaniami perl5 (chociaż perl 5.12 lub być może 5.14 w końcu udało się usunąć niektóre niejasne funkcje, które były przestarzałe przez około 15 lat ... wystarczające ostrzeżenie, aby ich nie używać) chyba że twój styl kodowania jest naprawdę dziwny i lubisz ignorować ostrzeżenia o wartości „nie rób tego” ponad dekadę, twoje skrypty perla będą działać dobrze wszędzie. Język jest solidny i mocny i może zrobić wszystko, awki sedmoże zrobić więcej. Przy odrobinie wysiłku może to zrobićshjest tradycyjnie także dobry (np. uruchamianie zewnętrznych poleceń i używanie / piping danych wyjściowych). Standardowe biblioteki perla są również dość obszerne - obejmują więcej niż tylko podstawy.

Jedynym haczykiem dla perla jest to, że istnieje również ogromna biblioteka modułów CPAN, która pozwala zrobić wszystko, co tylko możesz wymyślić (i wiele innych rzeczy, które mogą ci się nie przydarzyć) - i nie wszystkie z nich będą dostępne w każdym systemie z perlem . Zazwyczaj są bardzo wysokiej jakości, więc łatwo jest przyzwyczaić się do ich używania - ale jeśli z nich skorzystasz, musisz upewnić się, że są zainstalowane. Wiele modułów CPAN jest wstępnie spakowanych dla Linuksa, a pozostałe można łatwo zainstalować za pomocą narzędzia cpan (lub dh-make-perlna debian / ubuntu / etc, aby zmienić moduł CPAN w pakiet .deb)

Chciałbym móc powiedzieć pythondalej, ale tak naprawdę nie mogę. W Pythonie jest wiele do polubienia, ale domyślnie nie jest on zawarty w wielu systemach Linux i, szczerze mówiąc, jego kompatybilność z wersjami (zarówno dla samego pythona, jak i jego rzekomo „standardowych” bibliotek) jest kompletną awarią. Niektóre dystrybucje starają się rozwiązać problem, a niektóre nie. Ani nie pomaga im to, że python jest w zasadzie językiem napisanym dla programistów przez programistów (w przeciwieństwie do sysadmins) i nie wydaje się, aby system, w którym zostaną zainstalowane, był w ogóle ważny ... ich kod jest naprawdę wyjątkowy, więc nie muszą się martwić nudnymi rzeczami takimi jak integracja z istniejącymi systemami.

(Nie rozumiem źle z mojego sarkazmu tutaj - naprawdę lubię python jako język, po prostu nienawidzę faktu, że zarządzanie wersjami i zależnościami to PITA. To jak cofanie się ponad 20 lat do ery ręcznego polowania na niejasne fragmenty kodu i łatki, aby coś skompilować i uruchomić na zastrzeżonym * nix)

cas
źródło
Wiem, że to stary post, ale najlepszym sposobem na ominięcie tego jest, aby określić, która wersja w shebang (np /usr/bin/python2, /usr/bin/python3).
Isiah Meadows
1

Sugeruję podążanie za ksh93 lub nawet POSIX i zawsze możesz użyć bash / zsh do uruchomienia.

Dystrybucja oparta na Debianie używa mawk, a nie gawk jako domyślnego awk. Tak więc unikaj dodawania gawk, ponieważ mawk jest znacznie szybszy.

Mea culpa
źródło
0

Nie walnij. Napisz do zbliżonego do POSIX sh, takiego jak myślnik lub jesion. To będzie najbardziej uniwersalne. Nie sądzę, żeby było coś jeszcze, co mogłoby być nawet bliskim konkurentem. (I wydaje mi się to faktycznym pytaniem, a nie „opinią”, jak narzeka jeden z komentatorów).

Jeśli potrzebujesz czegoś nieco mocniejszego niż sh (na przykład, jeśli chcesz prawdziwych tablic asocjacyjnych), użyj awk. (Unikanie rozszerzeń gawk. Istnieje wiele wersji awk, ale istnieje w dużej mierze wspólny rdzeń.) Powinien być dostępny prawie tak szeroko, jak sh.

dubiousjim
źródło
1
awk-on-Linux jest ogólnie gawk; Nie mogę wymyślić żadnej dystrybucji, która ma domyślnie inny wariant.
Ignacio Vazquez-Abrams,
5
Które warianty systemu Linux nie obsługują bash?
Jonathan Leffler,
1
Z pewnością bashmożna go zainstalować i uruchomić na (prawie) dowolnym Linux-ie, ale wielu użytkowników Debiana zainstaluje tylko dashi nie chce instalować bash.
William Pursell
6
@WilliamPursell Pakiet bash jest oznaczony jako niezbędny na Debianie (tzn. Musisz przejść przez obręcze, aby odinstalować, z licznymi ostrzeżeniami, że to doprowadzi twój system). Bash jest prawie uniwersalny w niewbudowanych systemach Linux.
Gilles „SO- przestań być zły”
1
@JathanathanLeffler: W przeciwieństwie do nich osadzone mogą mieć tylko Busybox.
Ślimak mechaniczny
0

Powiedziałbym, że dostępność byłaby gdzieś w tej kolejności:

  1. sh
  2. awk
  3. Perl (jeszcze nie widziałem * nix bez niego, w tym BSD)

Chociaż Python brzmi jak dobry język, nie używałem żadnego systemu operacyjnego, który był z nim dostarczany w podstawowej instalacji, choć najwyraźniej tak jest Ubuntu?

Earlz
źródło
0

Wierzę, że eksperci tutaj przedstawili już świetne sugestie, które powinny pomóc ci podjąć decyzję. Użyteczność i dostępność różnych powłok zostały dobrze opisane w innych postach.

Z drugiej strony, gdybym był tobą, rozważyłbym również cel, który chcę osiągnąć dzięki skryptom. Każde narzędzie ma swoje zalety i wady. Tak więc, chociaż w dużej mierze używam Pythona, nie będę tego używać w każdym przypadku.

Mogę wymyślić kilka scenariuszy i wspomnieć o kilku przydatnych dla nich narzędziach.

Pliki FTP w obie strony; przetwarzaj je; wysyłać powiadomienia e-mail; i tak dalej

W tym przypadku lepiej byłoby trzymać się z powłoki (np Bash) i korzystania z różnych narzędzi (np ftp, croni mail). Jest to typowy przypadek użycia w wielu dużych firmach.

Szybkie przetwarzanie tekstu

Jeszcze raz skorupa. Programy narzędziowe podoba grep, awk, sed, pastei inne są bardzo przydatne w tym przypadku.

Budować

W domenie C / C ++ uniwersalnym narzędziem do tego jest make. Świat Java woli Apache ANT.

Wdrażanie i zdalne sterowanie

Albo powłoka, albo Python. Na przykład, scpi rsyncodpowiednio, byłby całkiem użyteczny w kopiowaniu pliku (plikach) lub synchronizowaniu plików.

Z drugiej strony Python ma bardzo przydatny moduł o nazwie fabric. Przydałoby się to w bardziej skomplikowanych operacjach, np. Kopiowaniu plików, zatrzymywaniu niektórych procesów, tworzeniu serwera i podobnie. Ponadto Python zapewnia również moduł, pipktóry może rozwiązać określone zależności, pobierając i instalując odpowiednie pakiety.

(Należy zauważyć, że powyższe sugestie nie koncentrują się na funkcjach powłoki , ale raczej na różnych dostępnych narzędziach).

Barun
źródło
-1

Niestety, Perla nie ma w FreeBSD, NetBSD ani DragonflyBSD. OpenBSD ma Perla w instalacji podstawowej. OS X jest obecnie certyfikowanym systemem UNIX i może być uważany za pewnego rodzaju wariant BSD na pewnym poziomie i ma Perla, Pythona i Ruby w bazie.

Wiele zastrzeżonych systemów UNIX nie ma Perla w swojej bazie, na przykład Solaris, AFAIK ani HP-UX, ani IBM AIX ...

Marko V.
źródło
Twoje stwierdzenie o braku Perla w systemie Solaris jest nieprawidłowe. Perl jest obowiązkowym podstawowym składnikiem systemu Solaris przynajmniej od 2005 r. (Solaris 10).
jlliagre