Myślałem, że /bin/sh
to symboliczny link do mojej wybranej powłoki. Zawsze używałem bash
, więc założyłem, że /bin/sh
to wskaże /bin/bash
. Okazuje się jednak, że wskazuje /bin/dash
.
Robi się zabawniej. Zaczynam dash
i robię echo $SHELL
i drukuje /bin/bash
(więc są w zasadzie takie same?). Jednak strona człowiek dash
jest zupełnie inna od strony mężczyzny bash
(tak, oni nie to samo?).
echo $SHELL
drukuje/bin/bash
się tak dlatego, że zmienna jest ustawiana na domyślnej powłoki, który uruchamia podczas logowania zamiast bieżącej powłoki, którego używasz. Uruchom ksh lub zsh z wiersza polecenia Bash iecho $SHELL
nadal powie/bin/bash
. Użyj,ps
aby zobaczyć, co aktualnie działa.Odpowiedzi:
Debian i Ubuntu przeszły na dash (iirc) z kilku powodów. Po pierwsze, Bash stał się duży na przestrzeni lat. W rzeczywistości
/bin/bash
plik binarny w moim systemie Ubuntu 8.04 jest prawie dziesięć razy (!) Większy niż/bin/dash
. To nie ma większego znaczenia dla codziennego używania powłoki, ale ma to znaczenie w następujących sytuacjach:Wadą używania Dasha zamiast Basha do pisania skryptów jest to, że wiele osób korzysta z subtelności składni tylko Bash, tak zwanych Bashism . Przykładami baszizmów są podciągi, takie jak to:
I to:
Z drugiej strony Dash ma głównie na celu zachowanie zgodności z POSIX (i nie więcej), da ci zły błąd podstąpienia, jeśli spróbujesz:
Będzie to miało znaczenie, jeśli użyjesz
/bin/sh
(i dlategodash
) jako interpretera skryptów powłoki i użyjesz w nich baszizmów. Debian i Ubuntu mają ładne strony wiki o Bashismach i dlaczego są one złe w skryptach shells, aw szczególności skryptach init. Dlatego powinieneś świadomie wybrać, czy potrzebujesz/bin/sh
czy/bin/bash
jako tłumacz twojego skryptu.Dash nie powinien być używany jako domyślna powłoka w twoim systemie. Po prostu użyj do tego Bash. Aby zwiększyć przenośność skryptów, możesz użyć Dasha jako interpretera, aby zwiększyć szanse, że skrypty będą działały na innych wersjach Linuxa i Uniksach.
źródło
/bin/bash
; wiele systemów innych niż Linux ma rzeczywistesh
powłoki, z którymi nie są nawet blisko kompatybilnebash
.echo ${a#123}
nie jest bashizmem, jest częścią specyfikacji rozszerzenia parametru POSIX. pubs.opengroup.org/onlinepubs/009695399/utilities/… Po prostu nie dostajesz bardziej zaawansowanych wersji Bash w stylu sed, te posiksowe to style podciągowe + proste znaki rozwijające. Oznacza to, że POSIX zezwala równieżecho ${a#*6}
Spójrz tutaj: https://wiki.ubuntu.com/DashAsBinSh może To pomoże.
źródło
dash jest lekkim zamiennikiem bash, zakładam, że używasz ubuntu, które zmieniło się na niego kilka lat temu.
Nie jest to jednak zbyt dobre, imho. http://forums.debian.net/viewtopic.php?f=20&t=45116
źródło
Ponieważ nie wszystkie powłoki ustawione
$SHELL
podczas uruchamiania, możesz znaleźć swoją bieżącą powłokę za pomocą:Jeśli daje błąd, to jest csh, w przeciwnym razie
argv[0]
wywoływana jest przez Ciebie powłoka, zwykle jest to powłoka, być może z wiodącym-
łącznikiem, wskazująca, że jest to powłoka logowania.Nie jest to gwarantowane , ponieważ
argv[0]
jest pod kontrolą procesu wywoływania, ale w praktyce jest to najbardziej niezawodne podejście.źródło