Powinieneś tylko używać #! /bin/sh
.
Nie powinieneś nigdy używać rozszerzeń bash (lub zsh, fish, lub ...) w skrypcie powłoki.
Powinieneś pisać tylko skrypty powłoki, które działają z dowolną implementacją języka powłoki (w tym ze wszystkimi programami „narzędziowymi”, które towarzyszą samej powłoce). W dzisiejszych czasach prawdopodobnie możesz uznać POSIX.1-2001 ( nie -2008) za wiarygodne dla tego, co potrafi powłoka i narzędzia, ale pamiętaj, że pewnego dnia możesz zostać poproszony o przeniesienie skryptu do starszego systemu (np. Solaris lub AIX), którego skorupa i narzędzia zostały zamrożone około 1992 r.
Poważnie ?!
Tak poważnie.
Oto rzecz: Shell to straszny język programowania. Jedyne, co ma do tego, to to, że /bin/sh
jest to jedyny interpreter skryptów, który gwarantuje każda instalacja uniksowa.
Oto druga rzecz: pewna iteracja podstawowego interpretera Perl 5 ( /usr/bin/perl
) jest bardziej dostępna w losowo wybranej instalacji Unixa niż (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
jest. Inne dobre języki skryptowe (Python, Ruby, node.js itp. - W tej kategorii uwzględnię nawet PHP i Tcl w porównaniu z powłoką) są mniej więcej tak dostępne, jak bash i inne rozszerzone powłoki.
Dlatego jeśli masz opcję napisania skryptu bash, możesz zamiast tego użyć języka programowania, który nie jest straszny.
Teraz, proste skrypty powłoki, takie, które po prostu uruchamiają kilka programów w sekwencji z zadania crona lub coś takiego, nie ma nic złego w pozostawieniu ich jako skryptów powłoki. Ale proste skrypty powłoki nie potrzebują tablic ani funkcji, a [[
nawet. Powinieneś pisać skomplikowane skrypty powłoki tylko wtedy, gdy nie masz innego wyboru. Na przykład skrypty Autoconf są nadal poprawnie skryptami powłoki. Ale te skrypty muszą być uruchamiane przy każdym wcieleniu /bin/sh
istotnym dla konfigurowanego programu. a to oznacza, że nie mogą używać żadnych rozszerzeń. Prawdopodobnie w dzisiejszych czasach nie musisz przejmować się starymi zastrzeżonymi Uniksami, ale prawdopodobnie powinieneś przejmować się obecnymi BSD typu open source, z których niektóre nie instalują siębash
domyślnie oraz środowiska osadzone, które dają tylko minimalną powłokę i busybox
.
Podsumowując, moment znaleźć się chcąc funkcję, która nie jest dostępna w języku powłoki przenośnej, że jest to znak, że skrypt stał się zbyt skomplikowany, aby zatrzymać skrypt. Zamiast tego przepisz go w lepszym języku.
bash
funkcji i składni zamiastsh
funkcji i składni.