Ich dachte, /bin/sh
es wäre ein Symlink zu meiner bevorzugten Hülle. Ich habe es immer benutzt bash
, also nahm ich an, dass /bin/sh
es darauf hindeuten würde /bin/bash
. Es stellt sich jedoch heraus, dass es darauf hinweist /bin/dash
.
Es wird lustiger. Ich starte dash
und mache echo $SHELL
und es wird gedruckt /bin/bash
(also sind sie im Grunde gleich?). Die Manpage von unterscheidet sich dash
jedoch grundlegend von der Manpage von bash
(also sind sie nicht gleich?).
echo $SHELL
Ausdruck/bin/bash
ist, 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 undecho $SHELL
sagen Sie immer noch/bin/bash
. Verwenden Sieps
diese Option, um zu sehen, was gerade läuft.Antworten:
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/bash
Binä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: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:
Und das:
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 :
Dies ist wichtig, wenn Sie
/bin/sh
(und daherdash
) 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/sh
oder/bin/bash
fü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.
quelle
/bin/bash
. Viele Nicht-Linux-Systeme haben echtesh
Shells, mit denen sie nicht einmal annähernd kompatibel sindbash
.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}
Schauen Sie hier: https://wiki.ubuntu.com/DashAsBinSh Vielleicht hilft es.
quelle
dash ist ein leichtgewichtiger Bash-Ersatz, vorausgesetzt, Sie verwenden Ubuntu, das vor ein paar Jahren geändert wurde.
Es ist aber nicht übermäßig gut, imho. http://forums.debian.net/viewtopic.php?f=20&t=45116
quelle
Da
$SHELL
beim Ausführen nicht alle Shells festgelegt sind , ermitteln Sie Ihre aktuelle Shell mit: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.quelle