Co to jest / bin / dash?

27

Myślałem, że /bin/shto symboliczny link do mojej wybranej powłoki. Zawsze używałem bash, więc założyłem, że /bin/shto wskaże /bin/bash. Okazuje się jednak, że wskazuje /bin/dash.

Robi się zabawniej. Zaczynam dashi robię echo $SHELLi drukuje /bin/bash(więc są w zasadzie takie same?). Jednak strona człowiek dashjest zupełnie inna od strony mężczyzny bash(tak, oni nie to samo?).

aioobe
źródło
1
@wzzrd, Czy to pytanie jest specyficzne dla systemu Linux?
aioobe
1
westchnienie, nie mogę głosować na te wszystkie miłe odpowiedzi, ponieważ potrzebuję 15 powtórzeń. Czuję się upośledzony, ponieważ mam 18k na
przepełnieniu stosu
4
mmm dash .. co z / bin / crash (dla fanów gdb), / bin / slash (program oszczędnościowy), / bin / mash (ciężkie czasy w Korei), / bin / sash (dla cheerleaderek), / bin / thrash (na twardym dysku), / bin / flash (ale tylko jeśli szyfrujesz swoje dane), / bin / stash (powodzenia w znalezieniu go później), / bin / cash (zawsze masz pieniądze), / bin / pash (romancing komputera), / bin / gash (aaargggh!).
PP.
2
@PP - Przeczytałem / bin / thrash dla fanów muzyki metalowej i / bin / slash dla fanów gitarzystów prowadzących zespół rockowy z lat 80-tych ... :-P
gWaldo 21.10
1
Powodem echo $SHELLdrukuje /bin/bashsię 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 i echo $SHELLnadal powie /bin/bash. Użyj, psaby zobaczyć, co aktualnie działa.
Wstrzymano do odwołania.

Odpowiedzi:

43

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/bashplik 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:

  • Dash jest znacznie mniejszy i dlatego ładuje się szybciej, co jest dobrodziejstwem dla skryptów inicjujących. Jeśli musisz zacząć wiele z nich, za każdym razem ładowanie Dash zamiast Bash znacznie przyspiesza.
  • Z powodu mniejszego rozmiaru Dasha, Debian i Ubuntu są w stanie ogolić całkiem spory kawałek wielkości swojego initrd, pozostawiając więcej miejsca na inne rzeczy (i znowu, przyspieszając).

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:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

I to:

echo ${a#123}
4567890

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:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

Będzie to miało znaczenie, jeśli użyjesz /bin/sh(i dlatego dash) 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/shczy /bin/bashjako 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.

wzzrd
źródło
1
Jeśli piszesz skrypty za pomocą baszizmów, proszę określić /bin/bash; wiele systemów innych niż Linux ma rzeczywiste shpowłoki, z którymi nie są nawet blisko kompatybilne bash.
Chris S
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}
JM Becker
0

Ponieważ nie wszystkie powłoki ustawione $SHELLpodczas uruchamiania, możesz znaleźć swoją bieżącą powłokę za pomocą:

echo $0

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.

Phil P.
źródło