Wiem, że mogę użyć jednego z pierwszych wierszy skryptów do wywołania pożądanej powłoki.
Byłoby #!/bin/sh
zalecane, jeśli zgodność ze wszystkimi systemami uniksowymi jest absolutnym wymogiem?
W moim przypadku jedynym systemem, na którym mi zależy, jest Ubuntu (Debian) i OSX. Biorąc to pod uwagę, czy mogę używać #!/bin/bash
i mieć pewność, że będzie działał na obu systemach?
Czy ułatwiłoby to również korzystanie ze skryptów z bardziej nowoczesną i bardziej przejrzystą składnią poleceń? Czy używanie #!/bin/sh
odnosi się również do używania POSIX?
/bin
i/usr/bin
. W związku z tym prawdopodobnie lepiej jest teraz używać#!/usr/bin/env <shname>
do przenoszenia.Odpowiedzi:
Na początek, jeśli możesz założyć, że Bash jest wstępnie zainstalowany (co, zgodnie z moją wiedzą, dotyczy wszystkich wymienionych systemów), użyj następującego hashbangu, aby być kompatybilnym:
wywołuje to wszystko
bash
, co dzieje się w konfiguracji, bez względu na to, czy jest w,/bin
czy w/usr/local/bin
.Podczas gdy na większości systemów w szerokim zakresie (w tym AIX, Solaris, kilka odmian BSD),
bash
trafiał do różnych lokalizacji,env
zawsze trafiał do/usr/bin/env
. Sztuczka nie jest jednak moja, ale autorstwa autora książki kucharskiej Bash.W każdym razie, tak, Bash pozwoliłby ci użyć niektórych „nowoczesnych” funkcji, które ułatwią ci życie.
Na przykład podwójne nawiasy kwadratowe:
mając na uwadze, że w tradycyjnych dialektach skorupowych trzeba by uciekać się do:
ale najlepsze w podwójnych nawiasach jest to, że pozwalają na dopasowanie wyrażeń regularnych. Bash Hakerzy Wiki daje wiele sztuczek w tym kierunku.
Możesz także użyć całkiem wygodnych wyrażeń, takich jak
$((2**10))
lub inne wyrażenia arytmetyczne zgodne ze$((expression))
składnią.Używanie backsicków do podpowłok jest w porządku, choć nieco przestarzałe. Ale możliwości zagnieżdżania
$(command ...)
wywołań są znacznie wygodniejsze, ponieważ nie będziesz musiał uciekać przed wieloma rzeczami na różnych poziomach podpowłoki.To tylko kilka rzeczy, które oferuje Bash w stosunku do tradycyjnej
sh
składni POSIX .Ale jeśli chcesz więcej mocy na powłoce (nie tylko w skryptach), spójrz także
zsh
.źródło
sh
takich zadań.sh
połączonych zbash
tą luką luka nie zostanie zmniejszona za pomocąsh
.W Debianie i Ubuntu,
/bin/sh
isdash
, który jest powłoką zgodną z POSIX. Jeśli określisz#!/bin/sh
, musisz ograniczyć się do instrukcji POSIX w swoim skrypcie. (Zaletą jest to, żedash
zaczyna się szybciej niżbash
, dzięki czemu skrypt może wykonać swoją pracę w krótszym czasie).Na wielu (większości?) Innych systemach Linux
/bin/sh
jestbash
, dlatego wiele skryptów jest napisanych#!/bin/sh
jako ich linia shebang, mimo że używająbash
rozszerzeń.Jeśli chcesz używać
bash
rozszerzeń, najbezpieczniejszym podejściem we wszystkich systemach jest określenie#!/bin/bash
; w ten sposób wyraźnie określasz swoją zależnośćbash
. Ci potrzeba , aby to zrobić na Debianie i Ubuntu. Jako dodatkowy bonus, gdy uruchamiany jako/bin/sh
bash
dezaktywuje niektóre rozszerzenia (szczegółowe informacje można znaleźć w opisiebash
trybu POSIX ); więc określenie#!/bin/bash
jest konieczne, aby w pełni wykorzystaćbash
.Na OS X
/bin/bash
jest również dostępny i/bin/sh
jestbash
. Określanie również#!/bin/bash
będzie działać dobrze.źródło
Tak, zarówno OSX, jak i Linux
/bin/bash
. Powinieneś być całkowicie bezpieczny. Nie jest to jednak POSIX. Powłoka POSIX jest w/bin/sh
większości (wszystkich?) Systemach i jest to najbardziej przenośne podejście i jedyny sposób na kompatybilność z POSIX.Zauważ, że podczas gdy w wielu systemach
/bin/sh
wskazujebash
, w innych może wskazywać na różne powłoki. Jest to na przykład dowiązanie symboliczne dodash
Debiana i Ubuntu. Ponadto, nawet jeśli/bin/sh
jest to link dobash
, zachowanie powłoki zmienia się, gdy jest ona wywoływana jakosh
(zman bash
mojego wyróżnienia):źródło
Jeśli zgodność z „wszystkimi systemami uniksowymi” jest bezwzględnym wymogiem - a jeśli nie, to dlaczego piszesz skrypt powłoki? - więc tak, powinieneś używać
#! /bin/sh
, ponieważ Bash nie ma gwarancji, że zostanie zainstalowany w dowolnym miejscu , a co dopiero w nim/bin
.To właściwie dużo, dużo gorzej. Jeśli potrzebujesz kompatybilności ze wszystkimi systemami uniksowymi, w tym takimi jak Solaris i AIX, które zamroziły swoje środowiska powłoki około 1995 roku. Co oznacza, że musisz używać rzeczy takich jak staromodna
sort +N
składnia - że nowsze systemy spadły! Oznacza to również brak funkcji powłoki, brak tablic, nie[[ ... ]]
, nie${foo#glob}
, nie$(( ... ))
dla arytmetyki, być może brak$( ... )
podstawiania poleceń w stylu, małe i nieudokumentowane górne limity, jak duże mogą być dane wejściowe, ...Prawdopodobnie można uciec z nie przeszkadza przy tym dużo kompatybilności, ale jeśli jest to nawet problem w pierwszej kolejności, gorąco polecam wziąć pod uwagę język, który jest mniej straszny niż powłoki. Podstawowy interpreter Perla jest bardziej dostępny niż Bash.
źródło