Co to znaczy być „kompatybilnym z sh”?

63

Widziałem wyrażenie „kompatybilny z sh” używane zwykle w odniesieniu do powłok. Nie jestem pewien, czy dotyczy to również programów, które mogą być uruchamiane z poziomu powłok.

Co to znaczy, że powłoka lub inny program jest „kompatybilny z sh”? Co by to znaczyło być „niekompatybilnym”?

Edycja: To pytanie zadające różnicę między uderzeniem a sh jest bardzo istotne: Różnica między sh i bash

Nadal chciałbym bezpośrednią odpowiedź na to, co to znaczy być „kompatybilnym z sh”. Rozsądnym oczekiwaniem może być to, że „kompatybilny z sh” oznacza „implementuje język poleceń Shell”, ale dlaczego jest tak wiele powłok „sh kompatybilnych” i dlaczego są one różne?

Prakseolityczny
źródło
1
W przypadku skryptu powłoki odnosi się do tego, czy ten skrypt używa zgodnej ze składnią (działającej) z Bourne Shell ( sh). W przypadku innej powłoki odnosi się do tego, czy ta powłoka może uruchamiać skrypty powłoki Bourne.
HalosGhost
Jeśli chcesz nauczyć się wynalazcy pocisków, możesz odwiedzić moją odpowiedź na unix.stackexchange.com/questions/45684/…
PersianGulf

Odpowiedzi:

116

Dlaczego jest tyle powłok kompatybilnych z „sh”?

Bourne shell został po raz pierwszy publicznie wydany w 1979 roku jako część Unix V7 . Ponieważ prawie każdy uniksowy i podobny do niego system wywodzi się od V7 Unix - nawet jeśli tylko duchowo - powłoka Bourne'a jest z nami „na zawsze” ¹

Powłoka Bourne'a faktycznie zastąpiła wcześniejszą, ponownie nazwała powłokę Thompson , ale stało się tak wcześnie w historii Unixa, że ​​dziś jest prawie zapomniana. Powłoka Bourne'a jest nadzbiorem powłoki Thompson

Nazywano zarówno pociski Bourne'a, jak i Thompsona sh. Powłoki określony przez POSIX jest również nazywany sh. Tak więc, gdy ktoś mówi „ shkompatybilny”, odnosi się do tej serii powłok. Gdyby chcieli być konkretni, powiedzieliby „powłoka POSIX” lub „powłoka Bourne'a” ³

Powłoka POSIX jest oparta na wersji KornShell z 1988 roku , która z kolei miała zastąpić powłokę Bourne'a w AT&T Unix, przeskakując powłokę BSD C pod względem funkcji. W zakresie, w jakim kshjest przodkiem powłoki POSIX, większość Systemy uniksowe i podobne do systemu Unix zawierają dziś pewien wariant powłoki Korn. Wyjątkami są na ogół małe systemy osadzone, które nie mogą sobie pozwolić na miejsce, które zajmuje kompletna powłoka POSIX.

To powiedziawszy, powłoka Korn - jako odrębna od powłoki POSIX - nigdy tak naprawdę nie stała się popularna poza komercyjnym światem Unix. Jest tak, ponieważ jego wzrost odpowiadał wczesnym latom komercjalizacji Uniksa, więc został wciągnięty w wojny z Unixem . BSD Unixes zrezygnował z niego na rzecz powłoki C, a jego kod źródłowy nie był swobodnie dostępny do użycia w Linuksie, kiedy się zaczął. ⁵ Kiedy pierwsi dystrybutorzy Linuksa zaczęli szukać powłoki poleceń do jądra Linux, zwykle wybierali GNU Bash , jeden z tych shkompatybilnych programów, o których mówisz

Że na początku stowarzyszenie między Linuksem a bash dość dużo przypieczętował los wielu innych pocisków, w tym ksh, cshi tcsh. Dzisiaj są jeszcze bardzo trudni ludzie używający tych pocisków, ale są oni w mniejszości

Cała ta historia wyjaśnia, dlaczego twórcy względnych spóźniających się, jak bash, zshi yashzdecydowali się uczynić je shkompatybilnymi: kompatybilność Bourne / POSIX to minimum, jakie musi zapewnić powłoka systemów uniksowych, aby zyskać szerokie zastosowanie.

W wielu systemach domyślna interaktywna powłoka poleceń /bin/shjest inna. /bin/shmoże:

  • Oryginalna skorupa Bourne'a. Jest to powszechne w starszych systemach UNIX®, takich jak Solaris 10 (wydany w 2005 r.) I jego poprzednicy

  • Powłoka z certyfikatem POSIX. Jest to powszechne w nowszych systemach UNIX®, takich jak Solaris 11 (2010).

  • Powłoki Almquist . Jest to klon powłoki Bourne / POSIX o otwartym kodzie źródłowym, pierwotnie wydany na Usenecie w 1989 r. , Który został następnie włączony do CSRG Berkeleya w celu włączenia go w pierwszym wydaniu BSD nie zawierającym kodu źródłowego AT&T, 4.4BSD-Lite . Powłoka Almquista jest często nazywana ash, nawet jeśli jest instalowana jako /bin/sh.

    4.4BSD-Lite z kolei stało się podstawą wszystkich współczesnych pochodnych BSD, /bin/shpozostając w większości pochodnymi Almquista, z jednym ważnym wyjątkiem wymienionym poniżej. Możesz zobaczyć to bezpośrednie pochodzenie w repozytoriach kodu źródłowego dla NetBSD i FreeBSD : wysyłali pochodną powłoki Almquist od pierwszego dnia.

    Istnieją dwa ważne ashwidelce poza światem BSD:

    1. dash, powszechnie przyjęte przez Debian i Ubuntu w 2006 roku jako domyślna /bin/shimplementacja. (Bash pozostaje domyślną interaktywną powłoką poleceń w pochodnych Debiana).

    2. ashKomenda w BusyBox , który jest często stosowany w wbudowanych dystrybucji Linksa i mogą być wykorzystane do realizacji /bin/sh. Ponieważ jest on datowany dashi pochodzi ze starego ashpakietu Debiana , postanowiłem uznać go za pochodną dashzamiast ash, pomimo nazwy polecenia w BusyBox.

      (BusyBox zawiera także mniej funkcjonalną alternatywę dla ashwywoływanych hush. Zazwyczaj tylko jeden z dwóch zostanie wbudowany w dowolny plik binarny BusyBox: ashdomyślnie, ale hushgdy przestrzeń jest bardzo ograniczona. Zatem /bin/shw systemach opartych na BusyBox nie zawsze jest dashpodobny.)

  • GNU Bash , który wyłącza większość rozszerzeń innych niż POSIX, gdy jest wywoływany jakosh .

    Ten wybór jest typowy dla wersji Linuksa na komputery i serwery, z wyjątkiem Debiana i jego pochodnych. Mac OS X również to zrobił od czasu wydania Panther w 2003 roku.

  • Powłoka z ksh93rozszerzeniami POSIX , jak w OpenBSD . Chociaż powłoka OpenBSD zmienia zachowanie, aby uniknąć niezgodności składniowej i semantycznej z powłokami Bourne i POSIX po wywołaniu jako sh, nie wyłącza żadnego z czystych rozszerzeń, ponieważ nie powoduje konfliktu ze starszymi powłokami.

    To nie jest powszechne; nie powinieneś oczekiwać ksh93funkcji w /bin/sh.

Użyłem „skryptu powłoki” powyżej jako ogólnego terminu oznaczającego skrypty powłoki Bourne / POSIX. Wynika to z wszechobecności muszli rodziny Bourne. Aby mówić o skryptach na innych powłokach, musisz podać kwalifikator, na przykład „Skrypt powłoki C.” Nawet w systemach, w których powłoka rodziny C jest domyślną powłoką interaktywną, lepiej jest używać powłoki Bourne'a do pisania skryptów.

Mówi, że kiedy Wikipedia klasyfikuje powłoki Unix , grupują je w kompatybilne z powłoką Bourne'a, kompatybilne z powłoką C i „inne”.

Ten schemat może pomóc:

Powłoki Unix: rodziny powłok Bourne, Korn, POSIX, C i rc

(Kliknij, aby zobaczyć wersję SVG, 31 kB lub zobacz pełnowymiarową wersję PNG , 218 kB.)

Co by to znaczyło być „niekompatybilnym”?

Ktoś mówi o shrzeczy niezgodnej zwykle oznacza jedną z trzech rzeczy:

  1. Odnoszą się do jednej z tych „innych” powłok

  2. Rozróżniają rodziny skorup Bourne'a i C.

  3. Mówią o pewnej specyficznej funkcji w jednej powłoce rodziny Bourne, której nie ma we wszystkich innych powłokach rodziny Bourne. ksh93, bashOraz zshw szczególności mają wiele cech, które nie istnieją w starszych „standardowych” muszli. Te trzy są również wzajemnie niekompatybilne na wiele sposobów, gdy wyjdziesz poza wspólne POSIX / ksh88base.

Klasycznym błędem jest napisanie skryptu powłoki z #!/bin/sh linią shebang u góry, ale użycie w nim rozszerzeń powłoki Bash lub Korn. Ponieważ obecnie /bin/shjest jedną z powłok z powyższego schematu rodziny Korn / POSIX na tak wielu systemach, takie skrypty będą działać w systemie, w którym zostały napisane, ale potem zawiodą w systemach, w których /bin/shjest coś z szerszej rodziny powłok Bourne'a. Najlepszą praktyką jest używanie linii #!/bin/bashlub #!/bin/kshshebang, jeśli skrypt używa takich rozszerzeń.

Istnieje wiele sposobów sprawdzenia, czy dany skrypt powłoki rodziny Bourne jest przenośny:

  • Uruchom checkbashismsna nim narzędzie z projektu Debian, które sprawdza skrypt pod kątem „ bashism ”.

  • Uruchom go pod poshpowłoką w repozytorium pakietów Debiana, która celowo implementuje tylko funkcje określone przez SUS3 oraz kilka innych drobnych funkcji .

  • Uruchom go oshz projektu Schily Tools , ulepszonej wersji powłoki Bourne'a otwartej od Sun w ramach OpenSolarisa w 2005 roku, co czyni ją jednym z najprostszych sposobów na uzyskanie powłoki Bourne'a w stylu z 1979 roku na nowoczesnym komputerze.

    Dystrybucja Schily Tools obejmuje również boshpowłokę typu POSIX z wieloma niestandardowymi funkcjami , ale może być przydatna do testowania zgodności skryptów powłoki przeznaczonych do działania na wszystkich powłokach rodziny POSIX. To wydaje się być bardziej konserwatywny w zestaw funkcji niż bash, zshoraz rozszerzonych wersjach ksh93.

    Schily Tools zawiera również powłokę o nazwie bsh, ale jest to historyczna osobliwość, która wcale nie jest powłoką rodziny Bourne'a.

  • Przejrzyj rozdział Przenośne programowanie powłoki w podręczniku GNU Autoconf . Możesz rozpoznać niektóre problematyczne konstrukcje, o których mówi w swoich skryptach.

Dlaczego się różnią?

Z tych samych powodów wszystkie „Nowe i ulepszone!” rzeczy są różne:

  • Ulepszoną wersję można ulepszyć tylko poprzez zerwanie z kompatybilnością wsteczną.

  • Ktoś pomyślał o innym sposobie działania, który im się bardziej podoba, ale który nie jest tym samym, co stary.

  • Ktoś próbował ponownie wdrożyć stary standard, nie do końca go rozumiejąc, więc popełnił błąd i stworzył niezamierzoną różnicę.


Przypisy i na bok :

  1. Wczesne wersje BSD Unix były tylko dodatkowymi kolekcjami oprogramowania dla V6 Unix. Ponieważ powłoka Bourne'a została dodana do AT&T Unix dopiero w wersji 7, BSD technicznie nie zaczęło od posiadania powłoki Bourne. Odpowiedź BSD do pierwotnego charakteru powłoki Thompson był powłoka C .

    Niemniej, pierwsze wersje standalone z BSD (2.9BSD i 3bsd) oparto na V7 lub jego następcy przenośnej UNIX / 32V , więc nie obejmują powłoki Bourne.

    (Linia 2BSD stała się równoległym rozwidleniem BSD dla minikomputerów Digital PDP , podczas gdy linie 3BSD i 4BSD wykorzystały nowsze typy komputerów, takie jak stacje robocze Vaxen i Unix . 2.9BSD była zasadniczo wersją PDP 4.1cBSD; były to współczesny, a wspólny kod . PDP nie tylko znikają, gdy VAX przybył, więc linia 2BSD jest nadal guzdrających wzdłuż ).

    Można śmiało powiedzieć, że powłoka Bourne'a była wszędzie w świecie uniksowym do 1983 roku. To dobre przybliżenie do „na zawsze” w branży komputerowej. MS-DOS otrzymał w tym roku hierarchiczny system plików (awww, jak cuuute!) I pierwszy 24-bitowy Macintosh z 9 - calowym ekranem czarno - białym - nie w skali szarości, dosłownie czarno - białym - nie pojawiłby się na początku następnego roku.

  2. Pancerz Thompsona był dość prymitywny jak na dzisiejsze standardy. To była tylko interaktywna powłoka poleceń, a nie środowisko programowania skryptów, którego oczekujemy dzisiaj. Miał takie rzeczy jak potoki i przekierowanie I / O, które uważamy za prototypowo część „powłoki Unix”, tak więc myślimy o powłoce poleceń MS-DOS jako o pobieraniu ich z Uniksa.

    Bourne powłoki wymienić także powłoki PWB , które dodaje ważne co do powłoki Thompson, jak programowalność ( if, switchi while) oraz pierwszą formę zmienne środowiska. Powłoka PWB jest jeszcze mniej dobrze zapamiętywana niż powłoka Thompson, ponieważ nie była częścią każdej wersji Uniksa.

  3. Kiedy ktoś nie jest konkretny w kwestii zgodności powłoki POSIX z Bourne, może oznaczać cały szereg rzeczy.

    Z jednej strony mogliby użyć powłoki Bourne'a z 1979 r. Jako podstawy. Określenie „ sh-Kompatybilny skrypt” w tym sensie oznaczałoby oczekuje się, by idealnie na prawdziwej powłoki Bourne lub jego następców prawnych i klonów: ash, bash, ksh, zsh, etc.

    Ktoś z drugiej strony przyjmuje zamiast tego powłokę określoną przez POSIX. Obecnie bierzemy tak wiele funkcji powłoki POSIX jako „standardowe”, że często zapominamy, że tak naprawdę nie były one obecne w powłoce Bourne'a: ​​wbudowana arytmetyka, kontrola zadań, historia poleceń, aliasy, edycja wiersza poleceń, $()forma polecenia zamiana itp.

  4. Chociaż skorupa Korna ma korzenie sięgające wczesnych lat 80., AT&T nie dostarczał jej w Uniksie aż do wydania Systemu V w wersji 4 w 1988 roku. Ponieważ tak wiele komercyjnych Uniksów opiera się na SVR4, wprowadzono kshprawie każdy odpowiedni komercyjny Unix z pod koniec lat 80.

    (Kilka dziwnych uniksowych smaków opartych na SVR3 i wcześniejszych trzymało się kawałków rynku po wydaniu SVR4, ale były one pierwsze pod ścianą, gdy nadeszła rewolucja ).

    Rok 1988 jest również rokiem, w którym pojawił się pierwszy standard POSIX , z opartą na powłoce Korna „powłoką POSIX”. Później, w 1993 roku, pojawiła się ulepszona wersja skorupy Korna. Ponieważ POSIX skutecznie przybił oryginał, kshrozwidlił go na dwie główne wersje: ksh88i ksh93nazwał po latach zaangażowanych w ich podział.

    ksh88nie jest w pełni kompatybilny z POSIX, choć różnice są niewielkie, dlatego niektóre wersje ksh88powłoki zostały załatane, aby były zgodne z POSIX. (To z ciekawego wywiadu na temat Slashdota z Dr. Davidem G. Kornem . Tak, facet, który napisał powłokę.)

    ksh93jest w pełni kompatybilnym nadzbiorem powłoki POSIX . Rozwój ksh93był sporadyczny, odkąd główne repozytorium źródeł zostało przeniesione z AT&T do GitHub, a najnowsze wydanie ma około 3 lat, kiedy to piszę, ksh93v. (Podstawowa nazwa projektu zawiera ksh93sufiksy dodane w celu oznaczenia wersji po 1993 roku).

    Systemy, które zawierają powłokę Korna jako odrębną rzecz od powłoki POSIX, zwykle udostępniają ją jako /bin/ksh, chociaż czasami chowa się gdzie indziej.

    Kiedy mówimy o kshskorupie Korna z nazwy, mówimy o ksh93cechach, które odróżniają ją od jej kompatybilnych wstecz podzbiorów powłok Bourne i POSIX. ksh88Dzisiaj rzadko spotykasz się z czystym .

  5. AT&T zachował własność kodu źródłowego powłoki Korna do marca 2000 r . W tym momencie powiązanie Linuksa z GNU Bash było bardzo silne. Bash i ksh93 każdy z nich ma przewagę nad innymi , ale w tym momencie bezwładność utrzymuje Linuksa ściśle związany z Bash.

    Jeśli chodzi o to, dlaczego pierwsi dostawcy Linuksa najczęściej wybierali GNU Bash pdksh, który był dostępny w momencie uruchamiania Linuksa, sądzę, że dzieje się tak, ponieważ tak duża część pozostałej części użytkownika pochodzi również z projektu GNU . Bash jest również nieco bardziej zaawansowany niż pdksh, ponieważ programiści Bash nie ograniczają się do kopiowania funkcji powłoki Korna.

    Prace pdkshzakończyły się w momencie, gdy AT&T wydało kod źródłowy do prawdziwej powłoki Korna. Istnieją dwa główne widły, które nadal są utrzymywane, jednak: OpenBSD pdkshi MirBSD Korn Shellmksh .

    Uważam za interesujące, że mkshjest to jedyna implementacja powłoki Korna obecnie pakowana dla Cygwin.

  6. GNU Bash wykracza poza POSIX na wiele sposobów, ale możesz poprosić go o uruchomienie w czystszym trybie POSIX .

  7. csh/ tcshbył zwykle domyślną interaktywną powłoką w systemach uniksowych BSD na początku lat 90.

    Będąc wariantem BSD , wczesne wersje Mac OS X były takie, poprzez Mac OS X 10.2 „Jaguar” . OS X zmienił domyślną powłokę tcshna Bash w OS X 10.3 „Panther” . Ta zmiana nie wpłynęła na systemy zaktualizowane z wersji 10.2 lub wcześniejszej. Obecni użytkownicy w tych skonwertowanych systemach zachowali tcshpowłokę.

    FreeBSD twierdzi, że nadal używa tcshjako domyślnej powłoki , ale na maszynie wirtualnej FreeBSD 10, którą tu mam, domyślna powłoka wydaje się być jedną z odmian powłoki Almquist kompatybilnych z POSIX . Dotyczy to również NetBSD.

    OpenBSD używa pdkshzamiast tego rozwidlenia jako domyślnej powłoki.

    Większa popularność Linuksa i OS X sprawia, że ​​niektórzy ludzie żałują, że FreeBSD nie zmieni się również na Bash, ale nie zrobią tego w najbliższym czasie z powodów filozoficznych . Jest łatwo je przełączać , jeśli to przeszkadza.

  8. Obecnie rzadko można znaleźć system z prawdziwie waniliową powłoką Bourne'a /bin/sh. Musisz zrobić wszystko, aby znaleźć coś wystarczająco blisko do testowania zgodności.

    Znam tylko jeden sposób na uruchomienie oryginalnej powłoki Bourne'a z 1979 roku na nowoczesnym komputerze: użyj obrazów dysku Ancient Unix V7 z symulatorem SIMH PDP-11 z Computer History Simulation Project . SIMH działa na prawie każdym nowoczesnym komputerze , nie tylko na Uniksie. SIMH działa nawet na Androidzie i iOS .

    W przypadku OpenSolaris firma Sun po raz pierwszy zakupiła wersję SVR4 powłoki Bourne'a. Wcześniej kod źródłowy wersji Bourne'a po wersji V7 był dostępny tylko dla osób posiadających licencję na kod źródłowy w systemie Unix.

    Ten kod jest teraz dostępny osobno od reszty nieistniejącego projektu OpenSolaris z kilku różnych źródeł.

    Najbardziej bezpośrednim źródłem jest projekt powłoki Heirloom Bourne . Stało się to dostępne wkrótce po wydaniu OpenSolaris w 2005 roku. W ciągu następnych kilku miesięcy wykonano prace związane z przenoszeniem i naprawą błędów, ale prace nad projektem zostały wstrzymane.

    Jörg Schilling wykonał lepszą robotę, utrzymując wersję tego kodu, tak jak oshw swoim pakiecie Schily Tools . Więcej informacji na ten temat znajduje się powyżej.

    Należy pamiętać, że te powłoki pochodzące z wydania kodu źródłowego 2005 zawierają wielobajtową obsługę zestawu znaków , kontrolę zadań, funkcje powłoki i inne funkcje nieobecne w oryginalnej powłoce Bourne'a z 1979 roku.

    Jednym ze sposobów stwierdzenia, czy korzystasz z oryginalnej powłoki Bourne'a, jest sprawdzenie, czy obsługuje ona dodaną nieudokumentowaną funkcję ułatwiającą przejście z powłoki Thompson: ^jako alias |. To znaczy, że polecenie takie ls ^ morespowoduje błąd w powłoce typu Korna lub POSIX, ale będzie zachowywać się jak ls | morew prawdziwej powłoce Bourne'a.

  9. Czasami napotkasz fish, scshlub rc/esprzylegające, ale są jeszcze rzadsze niż fanów powłoki C.

    rcRodzina muszli nie jest powszechnie stosowany w systemach Unix / Linux, ale rodzina jest historycznie ważne, co jest, jak to zdobył miejsce w powyższym schemacie. rcjest standardową powłoką systemu Plan 9 z systemu operacyjnego Bell Labs , swego rodzaju następcą dziesiątej edycji systemu Unix , utworzonego w ramach ciągłych badań Bell Labs nad projektowaniem systemu operacyjnego. Jest to niezgodne zarówno z powłoką Bourne'a, jak i C na poziomie programowania; prawdopodobnie jest tam lekcja.

    Najbardziej aktywnym wariantem rcwydaje się być ten utrzymywany przez Toby'ego Goodwina , który jest oparty na rcklonie Uniksa autorstwa Byrona Rakitzisa.

Warren Young
źródło
Jeśli chcesz poznać więcej relacji, np. Z „komendą” UNOS, „bsh” i najnowszą wersją Bourne Shell, wyślij mi notatkę. Jako wskazówka: polecenie UNOS miało wbudowane polecenie „do”, które działało jak jednowierszowy skrypt powłoki z argumentami. Pomysł ten został przeniesiony do powłoki Bourne'a jako „dosh” i pozwala na parametryzowalne aliasy, czego nie można uzyskać z ksh lub bash.
schily
Warto zauważyć, że sam pdksh opiera się na powłoce Forsyth. Najczęściej zapomniany dzisiaj, ale ma pewne historyczne znaczenie w dziedzictwie pdksh, ale także dlatego, że był powłoką niektórych wersji minix i został przeniesiony do msdos.
Stéphane Chazelas
25

„sh zgodny” odnosi się do POSIXsh , podstawowej powłoki, która musi istnieć we wszystkich kompatybilnych systemach. Skrypt zgodny z SH powinien działać na każdym komputerze zgodnym z POSIX.

Powodem jest to konieczne, aby powiedzieć, że jest tak powszechnie /bin/shjest dowiązaniem do /bin/bash, który pozwolił niektóre Bashisms wsunąć do skryptów, które deklarują się korzystać shz #!/bin/sh. Te skrypty nie działają w systemach, które nie używają bashjako /bin/sh, w tym niektórych komercyjnych Unices na zawsze, a ostatnio w Debianie i pochodnych .

W szczególności ostatnio dashużywano powłoki Debian Almquish Shell sh, ponieważ jest ona mniejsza i ma być szybsza. Trend ten uwypuklił wiele tych baszizmów, które były w rzekomych shskryptach. Opisanie czegoś jako „kompatybilnego z sh” oznacza, że ​​jest wyraźnie przeznaczony do pracy z tymi systemami, pozostając całkowicie w języku określonym przez POSIX - wszystkie powłoki implementują nadzbiór tej funkcjonalności, więc gwarantuje się, że będzie działać wszędzie, ale ich rozszerzenia nie są kompatybilne ze sobą.

Różne powłoki mają swoją własną historię rozwoju i z czasem ulegały rozbieżności w różnych kierunkach, ponieważ dodawały funkcje pomagające użytkownikom w interaktywnym użytkowaniu lub rozszerzenia skryptów, takie jak tablice asocjacyjne. Skrypt „sh-niekompatybilny” używałby niektórych z tych niestandardowych funkcji rozszerzenia, takich jak [[warunki warunkowe Basha .

Funkcje inne niż POSIX w bashi tcshoraz zshwszystkie inne bieżące powłoki są przydatne i istnieje wiele okazji, w których możesz ich potrzebować lub potrzebować. Po prostu nie należy ich używać w skrypcie, który deklaruje się do pracy /bin/sh, ponieważ nie można polegać na tym, że te funkcje znajdują się w podstawowej shimplementacji systemu, na którym działa.

Skrypt, który musi użyć, powiedzmy, tablice asocjacyjne, należy upewnić się, że prowadzony z bashraczej niż sh:

#!/bin/bash
declare -A array

To będzie działać wszędzie bash. Skrypty, które nie potrzebują rozszerzonej funkcjonalności i mają być przenośne, powinny zadeklarować, że używają shi trzymają się podstawowego języka poleceń powłoki.

Michael Homer
źródło