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 symbolicznym dash
. Zamiast tego możesz uczynić z niego link symboliczny bash
. Obecne wersje Debiana i Ubuntu (i pochodnych) sprawiają, że jest to opcja instalacji dash. Aby to zmienić, uruchom
sudo dpkg-reconfigure dash
i 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.
sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh
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, że ln -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
:
sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /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).
==
co powinno być=
. To i że zmienne rozszerzenia powinny być podwójnie cytowane.