Kiedy ważne jest pisanie przenośnych skryptów?

18

Większość kodu, który piszę, jest w języku PHP. Niedawno zacząłem uczyć się skryptowania powłoki. Większość zasobów i samouczków, które napotkałem, jest specyficzna dla Bash. Niektórzy ostrzegają przed bashizmami, a inni nie. Dużo tu czytałem i Stack Overflow.

Ilekroć w odpowiedzi używa się baszizmów , ktoś nieuchronnie skomentuje:

Nie powinieneś używać <wstaw tutaj bashizm>. To nie jest przenośne.

Dzieje się tak nawet wtedy, gdy pytanie zostało oznaczone tagiem bash. Dla mnie to jak mówienie programistom PHP, że nie powinni używać nowego kodu w PHP 5, ponieważ nie można go używać z PHP 4. Lub mówienie komuś, że nie powinien pisać czegoś na Maca, ponieważ nie można go użyć w systemie Windows.

Kiedy piszę w PHP, wybieram minimalne wymagania i piszę kod zgodny z przyszłością . Nie martwię się o to, aby był kompatybilny wstecz .

Jeśli używam #!/bin/bashjako shebang, dlaczego nie powinienem używać bashism? Zaczynam mieć wrażenie, że niektórzy ludzie po prostu lubią bash bashisms (gra słów nie przeznaczonych) właśnie przez wzgląd na niego.

Ludzie często używają bashi shellzamiennie - prawdopodobnie dlatego, że bash jest domyślną powłoką w wielu systemach. Mogę więc zrozumieć dodanie komentarza, aby ostrzec, że kod używa bashism, ale nie rozumiem, że używanie ich jest niewłaściwe .

Oczywiście, jeśli piszę skrypt wyłącznie do użytku osobistego, mogę go napisać w dowolnym języku, który chcę. Chciałbym jednak pomyśleć, że część kodu, który piszę, może być przydatny dla innych.

Przed opublikowaniem próbowałem znaleźć odpowiedź na moje pytanie. Znalazłem wiele informacji na temat w jaki sposób przetestować dla przenośności, ale nie mógł znaleźć nic na temat , kiedy ważne jest , aby to zrobić.

Kiedy ważne jest pisanie przenośnych skryptów?

Na przykład,

  • jakie typy skryptów powinny być jak najbardziej przenośne?
  • jak powszechne są systemy bez zainstalowanego Bash?
  • jeśli w systemie jest zainstalowany Bash, czy będzie miał także wersję GNU find i innych narzędzi?
toksalot
źródło
4
Głosowałem za tym pytaniem i odpowiedziałem na nie, ale im więcej o nim myślę, tylko 2 ostatnie pytania pasują do strony. Inne są „oparte głównie na opiniach”.
Jordan
1
Pytanie to ma również meta aspekt: ​​chociaż może nie pomóc w początkowej odpowiedzi na pytanie, komentarze takie jak „to nie jest przenośne” mogą być bardzo pomocne dla innych czytelników, którzy natkną się na pytanie / odpowiedź miesiące lub lata później.
Bananguin
2
@Banguanguin Komentarze „To nie jest przenośne” nie przeszkadzają mi. To tylko informacja dla ciebie. Sam tego rodzaju komentarze zrobiłem. Niepokoi mnie to „Nie powinieneś używać ...”. Oznacza to, że z odpowiedzią jest coś nie tak. Byłoby to poprawne, gdyby na przykład zalecono nieaktualny kod. Więc zastanawiałem się, co jest nie tak z Bash.
toksalot
2
+1. Zwłaszcza, gdy pytanie ma bashsam tag, ktoś komentuje „To bashism i nie przenośny”. Kiedy odpowiadam na pytanie, które jest oznaczone C, nie obchodzi mnie, czy można je przenosić Javaczy nie.
PP
4
Wydaje mi się, że zawsze warto wskazać, że jest to bashkonkretna funkcja, a nie przenośność, tak jak chciałbym zauważyć, że dla jakiegoś narzędzia używane jest rozszerzenie specyficzne dla GNU (nawet jeśli pytanie zostało oznaczone jako Linux). Nigdy nie widziałem, żeby ktokolwiek powiedział „to jest bzdura i nigdy nie powinieneś go używać”.
Martin Tournoij

Odpowiedzi:

15

Jako członek tej społeczności często nie widzę ludzi, którzy nie zwracają uwagi na bashizm za rzeczy, które są ukierunkowane na bash. Mówiąc o przenośności, GNUizmy są znacznie gorsze niż bashizmy. Tak długo, jak używasz bashshebang, możesz oczekiwać, że skrypt zostanie wykonany przy użyciu bash. Nie możesz jednak zagwarantować wersji, chyba że wyraźnie to sprawdzisz. Wersja Bash 4 przyniosła kilka przydatnych funkcji, takich jak tablice asocjacyjne, ale Bash v3 jest nadal szeroko stosowany w systemach OS X i RHEL 5.

jakie typy skryptów powinny być jak najbardziej przenośne?

To więcej o twoich potrzebach i tym, co zdecydujesz się wspierać jako programista. Jeśli piszesz skrypt instalacyjny dla aplikacji obsługującej wszystkie typy * NIX, przenośność będzie bardzo ważna.

jak powszechne są systemy bez zainstalowanego Bash?

FreeBSD i Solaris 10 to przykłady systemów, które nie są domyślnie instalowane przez bash. Będzie go mieć większość systemów Linux, z wyjątkiem systemów osadzonych.

jeśli w systemie jest zainstalowany Bash, czy będzie miał także wersję GNU find i innych narzędzi?

Nie, a to jest prawdziwy problem z przenośnością. Jeśli ważna jest przenośność, powinieneś używać tylko funkcji poleceń powłoki zdefiniowanych w standardzie POSIX. Narzędzia GNU mogą być instalowane w systemach innych niż GNU, takich jak FreeBSD, ale jest mało prawdopodobne, aby były one pierwsze w PATH i nie można polegać na tych narzędziach, które zostaną zainstalowane.

Jordan
źródło
1
Myślę, że jest to bardziej na SO niż tutaj, gdzie często widzę ludzi ignorujących bzdury . Wiem tylko, że zauważyłem to wystarczająco często, aby mnie sfrustrować i zachęcić do zadania tego pytania.
toxalot
1
Więc jeśli narzędzia GNU są zainstalowane, ale nie najpierw w PATH, czy istnieje sposób, aby wywołać je konkretnie? W przeciwnym razie, dlaczego w ogóle zostały zainstalowane?
toksalot
@toxalot: Pliki binarne i skrypty są wywoływane jawnie przy użyciu ścieżek bezwzględnych.
Bananguin
1
@Banguanguin Więc jeśli ktoś miał zainstalowane narzędzia Bash i GNU (ale nie w PATH), mógłby użyć skryptu, gdyby go edytować, aby używać ścieżek bezwzględnych findi innych narzędzi specyficznych dla GNU, których użyłem? Oczywiście nie byłoby to przyjazne dla skryptu instalatora. Ale myślę o tym, by po prostu wrzucić coś na GitHub, aby inni mogli to zrobić, jeśli tego chcą. Nie obchodzi mnie, że nie jest przenośny dla każdego systemu. Po prostu nie chcę, aby było bezużyteczne na wielu systemach.
toksalot
1
@toxalot: tak, to może działać. jeśli umieścisz coś FIND=/opt/gnu/dispicable/bin/findna początku skryptu, a następnie użyjesz go ${FIND}zamiast findw skrypcie, dajesz ludziom jedno (!) miejsce na umieszczenie ścieżek instalacji i sprawienie, aby skrypt używał odpowiednich narzędzi.
Bananguin
5

Kiedy ważne jest pisanie przenośnych skryptów?

jakie typy skryptów powinny być jak najbardziej przenośne?

Kiedy używasz ich do swojego środowiska pracy i pracujesz (lub mógłbyś w przyszłości) na różnych komputerach - ORAZ nie musisz zmieniać swoich narzędzi przed zabraniem się do pracy.

np .: skrypt śmieci / rmzamiana


Mark Stewart:

... dla mojego zestawu narzędzi do rozwiązywania problemów zakładam, że będę mieć tylko vi i powłokę Korna. Próbuję używać poleceń, które działają na większości odmian Uniksa.

użytkownik3082
źródło
3
Podoba mi się zręczny „Bash-isms”, ale dla mojego zestawu narzędzi do rozwiązywania problemów zakładam, że będę mieć tylko vi i powłokę Korna. Próbuję używać poleceń, które działają na większości odmian Uniksa. W ten sposób jestem gotowy do triage'owania w systemie chorego bez martwienia się o to, jak zachowuje się polecenie ps, czy Bash, Perl czy PHP jest tam, gdzie jest.
Mark Stewart