Czy mogę założyć, że zsh
zainstalowano wystarczającą liczbę osób, aby uruchomić skrypty za pomocą
#!/usr/bin/env zsh
jak shebang?
A może sprawi to, że moje skrypty nie będą działać na zbyt wielu systemach?
Wyjaśnienie: Interesują mnie programy / skrypty, które użytkownik końcowy może chcieć uruchomić (np. W Ubuntu, Debian, SUSE, Arch i c.)
bash
zsh
portability
shebang
Profpatsch
źródło
źródło
zsh
mogą być popularne, podczas gdy w innych (sektor bankowy) jest to praktycznie niespotykane. Myślę, że powinieneś podać o wiele więcej informacji, jeśli potrzebujesz właściwej porady na ten temat.zsh
zainstalowałem na żadnym z moich systemów i nie zainstalowałbym go dla pojedynczego skryptu. Powinieneś nawet unikać bashism, mimo że bash jest zwykle dostępny.Odpowiedzi:
W celu przenoszenia, nie. Chociaż
zsh
można go skompilować na dowolnym systemie uniksowym lub podobnym do Unixa, a nawet Windowsie przynajmniej przez Cygwin, i jest pakowany dla większości uniksowych lajków typu Open Source i kilku komercyjnych, jednak na ogół nie jest zawarty w domyślnej instalacji.bash
z drugiej strony jest instalowany na systemach GNU (podobnie jakbash
powłoka projektu GNU), jak większość niewbudowanych systemów opartych na Linuksie, a czasami na systemach innych niż GNU, takich jak Apple OS / X. W komercyjnej stronie uniksową, Korn shell (wariant AT & T, choć bardziejksh88
jeden) jest normą, a zarównobash
izsh
są w opcjonalnych pakietów. Na BSD, preferowany interaktywna powłoka jest częstotcsh
natomiastsh
opiera się albo na Almquist skorupy lubpdksh
ibash
czyzsh
muszą być zainstalowane jako opcjonalne pakiety, jak również.zsh
jest instalowany domyślnie na Apple OS / X. Kiedyś/bin/sh
tam był. Domyślnie można go znaleźć w kilku dystrybucjach Linuksa, takich jak SysRescCD, Grml, Gobolinux i prawdopodobnie w innych, ale nie uważam żadnej z głównych.Podobnie jak w przypadku
bash
, istnieje kwestia zainstalowanej wersji, aw konsekwencji dostępnych funkcji. Na przykład często zdarza się, że systemy znajdują się wbash3
lubzsh3
. Ponadto nie ma gwarancji, że skrypt, dla którego teraz piszesz,zsh5
będzie działał,zsh6
chociaż tak jak w przypadku,bash
gdy starają się zachować kompatybilność wsteczną.W przypadku skryptów mój pogląd jest następujący: użyj składni powłoki POSIX, ponieważ wszystkie Uniksy mają co najmniej jedną powłokę o nazwie
sh
(niekoniecznie w/bin
), która jest w stanie zinterpretować tę składnię. Dzięki temu nie musisz się martwić o przenośność. A jeśli ta składnia nie jest wystarczająca dla twojej potrzeby, prawdopodobnie potrzebujesz więcej niż powłoki.Następnie masz następujące opcje:
źródło
Nie, nie możesz. Gwarantowana dostępność to
/bin/sh
przede wszystkim oryginalna skorupa Bourne'a. Prawie wszystkie (zwróć uwagę na „prawie”!) Instalacje Linuksa będą miały bash, ale w systemach * BSD jest to rzadkie (przekonanie BSD ma poważne obawy dotyczące kodu GPL, takiego jak bash). Nie wiem, jaka jest standardowa powłoka na Macu, ale znowu są wątpliwości co do GPL. To samo dotyczy Solaris.zsh jest niszową powłoką, nie ma jej w domyślnej instalacji Fedory (i nie sądzę, aby była domyślna dla większości głównych dystrybucji).
źródło
bash
(chociaż te systemy prawdopodobnie nie są główne cel OP miał na myśli jego pytanie)Myślę, że to naprawdę zależy od tego, jakich dodatkowych funkcji zsh używasz i gdzie. Jeśli planujesz rozpowszechniać swój skrypt między różnymi użytkownikami i systemami, sugerowałbym użycie bash, a nawet sh .
W tym samym czasie, jeśli skrypt został zaprojektowany do wykonywania w całej organizacji i masz konwencję, aby mieć zsh na swoich komputerach (na przykład ten sam podstawowy AMI), a twoje zadanie ma wyraźne korzyści z rozszerzeń takich jak zaawansowane selektory plików lub inne rzeczy z http: / /www.rayninfo.co.uk/tips/zshtips.html Powiedziałbym, śmiało!
źródło
Jak wspomniano,
bash
jest powszechnie dostępny w domyślnej instalacji dla wielu dystrybucji. Twój skrypt nie osiągnie największej liczby użytkowników, polegając na nimzsh
.Ważnym pytaniem, na które należy odpowiedzieć przed zaprojektowaniem skryptu, jest „ Dlaczego ma znaczenie, w której powłoce jest wykonywany skrypt? ”
Różne powłoki używają innej składni lub oferują dodatkowe funkcje powłoki, które mogą nie być obsługiwane przez inne powłoki. Aby napisać skrypt dla „ogólnego świata użytkowników końcowych systemu Linux”, określ, czy twój skrypt korzysta z funkcji składni lub powłoki zależnych od określonego środowiska powłoki.
Na przykład
bash
powłoka obsługuje niektóre rozszerzenia, które nie są obsługiwane przezdash
powłokę Bourne'a lub cokolwiek innego, na co/bin/sh
wskazuje system użytkownika.Spróbuj wykonać
echo {1..10}
w/bin/sh
porównaniu do,/bin/bash
a otrzymasz bardzo różne dane wyjściowe.To samo dotyczy
zsh
, chociaż obsługuje większośćbash
składni, oferuje dodatkowe rozszerzenie i składnię, które nie są obsługiwane przezbash
powłokę. Zobacz te tabele porównujące powłoki dla konkretnych przykładów.Możesz poszerzyć swoją potencjalną bazę użytkowników
bash
, stosując się do skryptów, które działają po wywołaniu#!/bin/sh -u
. Rodzi to jednak inne ważne pytanie: „ Co poświęca się w zamian za większą przenośność? ”Ustal, czy różnice związane z kwestiami bezpieczeństwa, funkcjonalnością, wydajnością, czy cokolwiek innego, co Twoim zdaniem jest priorytetem dla twojego skryptu, byłoby warte poświęcenia. Skrypt ze znaną luką w zabezpieczeniach może nie być potrzebny tylko dlatego, że działa w większej liczbie środowisk.
Napisano tak wiele skryptów,
bash
dlatego obsługa tych skryptów jest używana jako kryterium przy porównywaniu powłok poleceń . Znacznie więcej osób będzie mogło uruchomić Twój skrypt, niż gdyby polegał on nazsh
jakiejkolwiek innej składni wyłącznej dla środowiska powłoki.Pamiętaj też, że ostatecznie nie masz kontroli nad sposobem wykonywania skryptu przez użytkownika (przydatne również przy debugowaniu skryptów w różnych powłokach ):
Najlepszym sposobem na zrobienie tego jest uczynienie skryptów przenośnymi, o ile nie ma wielkiego poświęcenia dla jego działania.
Możesz także zobaczyć konwencje kodowania Bash - Przepełnienie stosu .
źródło
Jedyną rzeczą, którą możesz prawie zagwarantować, jest to, że istnieje
/bin/sh
. Może to być faktycznie statycznie połączona powłoka lub link do innej powłoki. Ta druga powłoka zwykle wykrywa, że jest nazywana sh i będzie działać w trybie zgodności.Zwróć uwagę na prawie w pierwszym zdaniu.
Każdy system uniksowy, na jakim kiedykolwiek pracowałem, miał to. Wiele z nich miało również zainstalowany bash (ale nie wszystkie . Na przykład bash nie jest domyślnie instalowany na niektórych BSD. Niektóre dystrybucje Linuksa są dostarczane z DASH , zamiast tego powłoką Debian Almquist.
Możesz zagwarantować instrukcje instalacji. Możesz dodać linię do pliku README, stwierdzającą, że wymaga zsh. Jeśli zbudujesz pakiet, możesz oznaczyć Zsh jako zależność. Możesz to sprawdzić za pomocą narzędzi autoconf / automake. Możesz sprawdzić, czy w skrypcie instalacyjnym znajduje się Zsh (zacznij od / bin / sh i spróbuj zlokalizować Zsh, jeśli zostanie znaleziony, kontynuuj. Jeśli nie wyświetli się błąd. Np. „Ostrzeżenie: ZSH nie jest zainstalowany. Przeczytaj plik instrukcji instalacji! „.)
Jestem pewien, że zapomniałem jeszcze kilku opcji. Ale kluczowe punkty to:
źródło
/bin/sh
. Wymaga to,sh
które we właściwym środowisku (które nie musi być środowiskiem domyślnym) zachowuje się tak, jak to określa./bin/sh
może nie być powłoką POSIX. Na przykład w systemie Solaris 10 i wcześniejszych wersjach wciąż była to powłoka Bourne'a, a standardsh
był w/usr/xpg4/bin
.