Co nie jest specyficzne dla powłoki?

9

Pod niektórymi odpowiedziami widzę komentarze, które zalecają unikanie poleceń specyficznych dla powłoki w odpowiedziach.

Skąd mam wiedzieć, które polecenia, operatory itp. Istnieją we wszystkich powłokach? Czy istnieje lista standardów?

  • man builtinsdaje listę poleceń. Czy to jedyne polecenia, których mogę używać w przenośnym skrypcie powłoki, który działa we wszystkich powłokach?
  • Czy wbudowany może być specyficzny dla powłoki?
  • Czy standardy dla Linuksa różnią się od innych Uniksów?
  • Co ze składnią? Czy znaki interpunkcyjne, operatory itp. Mogą się różnić w niektórych powłokach?
musa
źródło

Odpowiedzi:

12

Wiki Grega ma post na temat dostosowywania skryptów bash do Dash'a, który wskazuje na wiele „bashism” - dodatkowych funkcji, które są niestandardowe, ale są częścią bash. Unikanie tych bashism może pomóc uczynić twój skrypt bardziej przyjaznym dla różnych środowisk. To szczególnie odpowiada na niektóre pytania. Na przykład tak, istnieją operatory, które się różnią (jak ==), ale istnieje standardowy zestaw Posix, który powinien działać we wszystkich środowiskach.

Dla dokładniejszej lektury możesz sprawdzić standard Posix , który powinny spełniać wszystkie pociski. W szczególności objętość „Shell & Utilities”.

Trudniejsze niż różnice w powłoce są różnice w poleceniach. Wiele systemów Linux ma GNU find, ale jeśli piszesz przenośny skrypt, nie polegaj na swoim własnym man find, ponieważ istnieje wiele systemów z BSD find, który ma inny zestaw funkcji. Jeśli piszesz skrypty dla busybox, przekonasz się, że istnieją różne wersje z zupełnie innymi ncliterami. Takie rzeczy zawsze mnie dopadają, gdy wdrażam skrypt w różnych środowiskach.

Aby uzyskać dodatkowe informacje na temat dobrych praktyk skryptowych w powłoce, na blogu Davida Pashleya znajduje się również dobry zasób: Pisanie skryptów powłoki Solidnego Basha

Pamiętaj również, aby przeczytać odpowiedzi i komentarze Gilles na tej stronie. Ma wiele wskazówek na temat używania przenośnego kodu.

Shawn J. Goff
źródło
5

Napisanie skryptu powłoki w określonej powłoce oznacza zainstalowanie tej powłoki. Jedynym standardem jest posiadanie cshi shinstalacja na wszystkich wariantach Uniksa. Tak więc, jeśli chcesz, aby twój skrypt działał na Solarisie, * BSD i GNU, musiałbyś napisać go, powiedzmy, w powłoce Bourne'a.

Jednak większość poleceń Uniksa ma różne składnie w różnych implementacjach - spójrz na psSolaris, FreeBSD i GNU - więc w zależności od używanych narzędzi skrypt może i tak nie być przenośny. Istotne będzie także to, gdzie zainstalowana jest powłoka. Czy to jest /bin/bash /usr/bin/bash, /usr/local/bin/bashczy gdzieś indziej?

Nie znam żadnych standardów definiujących powłokę. Spójrz na rc lub http://192.220.96.201/es/es-usenix-winter93.html`">es dla dziwnych niestandardowych powłok, które jednak wydają się być zgodne z niektórymi powszechnymi pomysłami.

Sardathrion - przeciw nadużyciom SE
źródło
7
POSIX definiuje sh.
Random832