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?
linux
shell
scripting
portability
Gilles „SO- przestań być zły”
źródło
źródło
sh
./bin/sh
w systemie X czy Y ? Specyfikacja POSIX sh, specyfikacja SUSv3, SUSv4 sh, specyfikacja sh LSB? „sh” samo w sobie nic nie znaczy.sh
, a niezgodnesh
, 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.Odpowiedzi:
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/sh
jeśli pierwsza linia jest#!/bin/sh
. Istnieją systemy POSIX, w którychsh
znajduje 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,pipestatus
zmienna 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
sh
programu, 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.
źródło
W kolejności dostępności:
Potem już nikogo to nie obchodzi, ponieważ niewiele można zrobić tylko z tymi.
źródło
Zwykle powiedziałbym
sh
... ale skoro określiłeś Linuksa, powiembash
- 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żyjsh
.Po
bash
(ish
), następne najbardziej „uniwersalny” język skryptowy dla Linux byłby jakiś dialektawk
- zazwyczaj albomawk
albogawk
. 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 elementymawk
i będziegawk
dostępna, ale na niektórych dystrybucjach (na przykład debian)mawk
jest instalowana domyślnie igawk
jeś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,awk
ised
może zrobić więcej. Przy odrobinie wysiłku może to zrobićsh
jest 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-perl
na debian / ubuntu / etc, aby zmienić moduł CPAN w pakiet .deb)Chciałbym móc powiedzieć
python
dalej, 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)
źródło
/usr/bin/python2
,/usr/bin/python3
).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.
źródło
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.
źródło
bash
?bash
można go zainstalować i uruchomić na (prawie) dowolnym Linux-ie, ale wielu użytkowników Debiana zainstaluje tylkodash
i nie chce instalowaćbash
.Powiedziałbym, że dostępność byłaby gdzieś w tej kolejności:
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?
źródło
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
,cron
imail
). Jest to typowy przypadek użycia w wielu dużych firmach.Szybkie przetwarzanie tekstu
Jeszcze raz skorupa. Programy narzędziowe podoba
grep
,awk
,sed
,paste
i 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,
scp
irsync
odpowiednio, 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ł,pip
któ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).
źródło
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 ...
źródło