Biorąc pod uwagę, że POSIX jest najbliższy wspólnemu standardowi wśród wszystkich jednorożców, interesuje mnie, czy istnieje powłoka, która obsługuje go wyłącznie. Chociaż większość współczesnych powłok zapewnia obsługę POSIX (i bez problemu uruchomi skrypty zgodne z POSIX), nie radzą sobie dobrze z wskazywaniem funkcji niezgodnych.
Czy jest jakaś powłoka, która implementuje tylko POSIX i POSIX, w taki sposób, że generowałaby błąd dla dowolnej niezgodnej funkcji?
EDYCJA Chcę wyjaśnić, że nie pytam o ogólne wskazówki dotyczące pisania przenośnych skryptów powłoki. Pokrewne pytanie wspomniane w komentarzach już to obejmowało. Pomyślałem o tym pytaniu, gdy dowiedziałem się, że bash
ma --posix
opcję, ale tylko po to, aby odkryć, że ma ona wpływ tylko na niektóre zachowania związane z inicjalizacją, które nie są dokładnie tym, czego szukam.
źródło
dash
. Wspomniałem o przenośności jako ogólnym kontekście mojego pytania, ale to nie była jego prawdziwa intencja.Odpowiedzi:
Niestety „przenośny” jest zwykle silniejszym wymaganiem niż „zgodny z POSIX” dla skryptów powłoki. Oznacza to, że napisanie czegoś, co działa na dowolnej powłoce POSIX, nie jest zbyt trudne, ale trudniej jest uruchomić go na dowolnej powłoce w świecie rzeczywistym.
Możesz zacząć od zainstalowania każdej powłoki w menedżerze pakietów, w szczególności
posh
dźwięków Debiana, takich jak chcesz (zgodna z polityką zwykła skorupa). Polityką Debiana jest POSIX z kilkoma wyjątkami (echo -n
określone,local
...).Poza tym testy muszą obejmować kilka powłok (szczególnie / bin / sh) na wielu platformach. Testuję na Solarisie (/ bin / sh i xpg4 / sh) i BSD. Systemy AIX i HP-UX są bardzo zgodne i nie powodują problemów. bash to mały świat.
Polecam ten przewodnik Autoconf przenośny skorupy , która jest absolutnie genialny i oszczędza dużo czasu. Duże fragmenty są przestarzałe, ale to w porządku; po prostu pomiń TruUnix i Ultrix i tak dalej, jeśli cię to nie obchodzi!
źródło
posh
rzeczywiście brzmi jak to, o co proszę. Zrobię testy jak najszybciej.Możesz użyć ShellCheck (GitHub) jako linijki dla swoich skryptów powłoki. Istnieje również wersja online .
Aby wykryć problemy ze zgodnością POSIX (np. SC2039 ), linia shebang skryptu powłoki powinna być
#!/bin/sh
. Możesz także przejść--shell=sh
doshellcheck
.Przykład (
test.sh
):Wynik (
shellcheck test.sh
):źródło
Bash będzie działał w trybie zgodnym z POSIX, jeśli
POSIXLY_CORRECT
ustawiona jest zmienna środowiskowa. Z strony podręcznika:Wiele innych narzędzi GNU również będzie honorować
POSIXLY_CORRECT
, więc jeśli korzystasz z systemu zawierającego głównie narzędzia GNU (np. Większość systemów Linux), to dobry początek, jeśli twoim celem jest zgodność z POSIX.źródło
[[
.