Was ist / bin / dash?

27

Ich dachte, /bin/shes wäre ein Symlink zu meiner bevorzugten Hülle. Ich habe es immer benutzt bash, also nahm ich an, dass /bin/shes darauf hindeuten würde /bin/bash. Es stellt sich jedoch heraus, dass es darauf hinweist /bin/dash.

Es wird lustiger. Ich starte dashund mache echo $SHELLund es wird gedruckt /bin/bash(also sind sie im Grunde gleich?). Die Manpage von unterscheidet sich dashjedoch grundlegend von der Manpage von bash(also sind sie nicht gleich?).

aioobe
quelle
1
@wzzrd, Ist diese Frage Linux-spezifisch?
Aioobe
1
Seufz, ich kann all diese netten Antworten nicht gutheißen, da ich 15 Wiederholungen brauche. Ich fühle mich behindert, da ich 18.000 auf Stackoverflow habe: - /
aioobe
4
mmm dash .. was ist mit / bin / crash (für gdb fans), / bin / slash (ein sparprogramm), / bin / mash (in korea harte zeiten), / bin / sash (für cheerleader), / bin / thrash (Fest auf Ihrer Festplatte), / bin / flash (aber nur, wenn Sie Ihre Daten verschlüsseln), / bin / stash (viel Glück beim späteren Auffinden), / bin / cash (Sie haben immer Geld), / bin / pash (Romancing den PC), / bin / gash (aaargggh!).
PP.
2
@PP - Ich würde / bin / thrash für Metal-Musikfans und / bin / slash für Fans von Lead-Gitarristen der 80er-Rock-Band lesen ... :-P
gWaldo
1
Der Grund für den echo $SHELLAusdruck /bin/bashist, dass diese Variable für die Standard-Shell festgelegt ist, die beim Anmelden gestartet wird, und nicht für die aktuelle Shell, die Sie ausführen. Starten Sie ksh oder zsh an einer Bash-Eingabeaufforderung und echo $SHELLsagen Sie immer noch /bin/bash. Verwenden Sie psdiese Option, um zu sehen, was gerade läuft.
Bis auf weiteres angehalten.

Antworten:

43

Debian und Ubuntu sind wegen einiger Dinge auf Dash (iirc) umgestiegen. Erstens ist Bash im Laufe der Jahre groß geworden. Tatsächlich ist die /bin/bashBinärdatei auf meinem Ubuntu 8.04-System fast zehnmal (!) So groß wie /bin/dash. Nun, das ist für den täglichen Gebrauch der Shell nicht wichtig, aber in den folgenden Situationen ist es wichtig:

  • Dash ist viel kleiner und lädt daher schneller, was ein Segen für Init-Skripte ist. Wenn Sie viele davon starten müssen, beschleunigt das Laden von Dash anstelle von Bash die Dinge erheblich.
  • Aufgrund der kleineren Dash-Größe können Debian und Ubuntu einen ziemlich großen Teil der Größe ihrer Initrd abschneiden, wodurch mehr Platz für andere Dinge bleibt (und wiederum die Dinge beschleunigt werden).

Der Nachteil der Verwendung von Dash anstelle von Bash für die Skripterstellung ist, dass viele Leute syntaktische Feinheiten verwenden, die nur Bash bietet, die sogenannten Bashisms . Beispiele für Bashisms sind Teilstrings wie folgt:

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

Und das:

echo ${a#123}
4567890

Dash hingegen zielt hauptsächlich darauf ab, POSIX-kompatibel zu sein (und nicht mehr als das). Wenn Sie dies versuchen , wird ein Fehler aufgrund einer fehlerhaften Substition angezeigt :

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

Dies ist wichtig, wenn Sie /bin/sh(und daher dash) als Interpreter für Ihre Shellscripts verwenden und in diesen Bashisms verwenden. Debian und Ubuntu haben nette Wiki-Seiten über Bashisms und warum sie schlecht in Shellskripten im Allgemeinen und Init-Skripten im Besonderen sind. Daher sollten Sie sich bewusst entscheiden, ob Sie als Interpreter /bin/shoder /bin/bashfür Ihr Skript benötigen .

Dash sollte auf Ihren Systemen nicht als Standardshell verwendet werden. Benutze dafür einfach Bash. Um die Portabilität Ihrer Skripte zu gewährleisten, können Sie Dash als Interpreter verwenden, um die Wahrscheinlichkeit zu erhöhen, dass die Skripte auf anderen Linux-Versionen und -Unixen ausgeführt werden.

wzzrd
quelle
1
Wenn Sie Skripte mit Bashisms schreiben, geben Sie dies bitte an /bin/bash. Viele Nicht-Linux-Systeme haben echte shShells, mit denen sie nicht einmal annähernd kompatibel sind bash.
Chris S
echo ${a#123}ist kein Bashismus, sondern Teil der POSIX-Parameter-Erweiterungsspezifikation. pubs.opengroup.org/onlinepubs/009695399/utilities/… Die fortgeschritteneren Bash-Zeichen im Sed-Stil gibt es nicht. Die Posix-Zeichen sind Teilstring-Zeichen und einfache Erweiterungszeichen. Das heißt, POSIX erlaubt auchecho ${a#*6}
JM Becker
0

Da $SHELLbeim Ausführen nicht alle Shells festgelegt sind , ermitteln Sie Ihre aktuelle Shell mit:

echo $0

Wenn es einen Fehler gibt, ist es csh, andernfalls ist es das, mit dem argv[0]Sie aufgerufen wurden. Dies ist normalerweise die Shell, möglicherweise mit einem führenden -Bindestrich, um anzuzeigen, dass es sich um eine Anmeldeshell handelt.

Dies ist nicht garantiert , da argv[0]es unter der Kontrolle des aufrufenden Prozesses steht, aber es ist in der Praxis der zuverlässigste Ansatz.

Phil P
quelle