Instaluję ogromny program, który ma swoje zasoby w postaci rpm
pliku. Utknął na linii
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Widocznie sh
pracować bash
w systemie Red Hat Linux z tej składni, ale daje błąd unexpected operator
w Ubuntu.
Nie mogę zmienić skryptu na, bash
ponieważ skrypt pochodzi z rpm
pakietu. Mogę wyodrębnić i przepakować rpm
pakiet, ale może być wiele takich skryptów.
Czy istnieje sposób na zmianę domyślnej powłoki tak, aby traktowała ją #!/bin/sh
jak bash
coś innego, co może obsłużyć [
operatora?
==
co powinno być=
. To i że zmienne rozszerzenia powinny być podwójnie cytowane.[
nie jest operatorem, ale wywoływanym wbudowanym poleceniemtest
. Nieoczekiwany operator jest==
i powinien zostać zastąpiony przez,=
ponieważ nie jest zgodny z POSIX.$SCITEGICPERLHOME
należy ją zacytować.#!/bin/sh
, powinni upewnić się, że używają tylko funkcji powłoki POSIX, a niebash
rozszerzeń. Ten programista jest bardzo niechlujny. Powinien albo naprawić swój kod, albo użyć#!/bin/bash
.Odpowiedzi:
Istnieje wiele programów, które implementują język
/bin/sh
. Na Ubuntu/bin/sh
jest dash, który ma być szybki, zużywać niewielką ilość pamięci i nie obsługuje dużo więcej, niż oczekiwane minimum/bin/sh
. Na RHEL/bin/sh
jest bash, który jest wolniejszy i zużywa więcej pamięci, ale ma więcej funkcji. Jedną z tych funkcji jest==
operator[
składni warunkowej. Dash obsługuje[
, co jest podstawową funkcją sh, ale nie ma==
operatora, który jest rozszerzeniem bash (i ksh i zsh).Możesz przełączyć system na bash. Na Ubuntu
/bin/sh
jest dowiązaniem symbolicznymdash
. Zamiast tego możesz uczynić z niego link symbolicznybash
. Obecne wersje Debiana i Ubuntu (i pochodnych) sprawiają, że jest to opcja instalacji dash. Aby to zmienić, uruchomi odpowiedz „tak”, aby zachować myślnik jako
/bin/sh
lub „nie”, aby przejść do bash.Możesz zachować Bash jako
/bin/sh
, ale spowoduje to, że twój system będzie trochę wolniejszy. Jest nawet możliwe, że jakiś skrypt systemowy jest niezgodny z bash, chociaż jest to mało prawdopodobne, ponieważ bash jest przeważnie nadzbiorem dash.W przypadku dystrybucji, które nie mają interfejsu do wyboru pomiędzy implementacjami
/bin/sh
, oto jak przejść na bash.Pozostaw terminal otwarty i sprawdź, czy nadal możesz uruchamiać niektóre
sh
skrypty. Jeśli zepsujesz to polecenie, spowoduje to, że twój system będzie bezużyteczny. (Nawiasem mówiąc, powodem, dla którego użyłem wielu powyższych poleceń zamiast prostego wyglądu,sudo ln -sf bash /bin/sh
jest to, żeln -sf
nie jest atomowy. W bardzo mało prawdopodobnym przypadku awarii komputera podczas tej operacji, musisz uruchomić komputer z nośnika ratunkowego, aby go przywrócić. Przeciwnie,mv
jest atomowy.)Aby przywrócić myślnik jako
/bin/sh
:Zauważ, że jeśli sh jest
/bin/bash
domyślnie w twojej dystrybucji, przejście na myślnik może spowodować awarię skryptów, ponieważ bash ma o wiele więcej funkcji niż myślnik. Skrypty Bash powinny zaczynać się od#!/bin/bash
, a skrypty rozpoczynające się od#!/bin/sh
nie powinny używać funkcji specyficznych dla bash, ale dystrybucje dostarczane z bash/bin/sh
mogą używać funkcji specyficznych dla bash w#!/bin/sh
skryptach specyficznych dla tej dystrybucji (jest to w porządku, o ile użytkownicy nie oczekują, że użytkownicy można zmienić na myślnik jako/bin/sh
i nie ma żadnych oczekiwań, że te skrypty będą działać w innej dystrybucji).źródło
/bin/sh
jest Bash, jest to błąd albo w systemie (pakiet ze skryptem), albo w trybie Bashsh
. Jak mówi Stephen, system wyraźnie pozwala na/bin/sh
powrót do Bash za pośrednictwemdpkg-reconfigure
. Jest również wspomniany jako możliwość w wiki Ubuntu w tej sprawie: wiki.ubuntu.com/DashAsBinSh/bin/sh
jest bash, to błąd. Jednak zdarzają się błędy. Zalecam pozostanie przy ustawieniach domyślnych, jeśli nie jesteś w stanie i nie chcesz zdiagnozować takich błędów, ponieważ inne osoby przetestowały je dla Ciebie. Użyłem myślnika, tak jak/bin/sh
poprzednio, był on oficjalnie wspierany na Debianie, ale zaryzykowałem, wiedząc, że dam sobie radę, jeśli coś się stanie.debconf
przy następnejdash
aktualizacji; co prawda nie zdarza się to często (jeśli w ogóle, w danej wersji) dla systemów z stabilną wersją Debiana.Aby przełączyć się
sh
nabash
(zamiastdash
domyślnego), ponownie skonfigurowaćdash
(tak, jest to nieco sprzeczne z intuicją):To zapyta, czy chcesz
dash
być domyślną powłoką systemową; odpowiedz „Nie” ( Tabwtedy Enter) ibash
zamiast tego stanie się domyślnym ( tzn./bin/sh
wskaże/bin/bash
).źródło