Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: Frage zur dash  (Read 2686 times)

Offline dieres

  • User
  • Posts: 758
Frage zur dash
« on: 2011/01/15, 14:44:05 »
moin,

nach einem upgrade von lenny auf sueeze auf meinem keller-server funktionierte der Anrufbeantworter vbox3 mit dem mailversand nicht mehr, weil die default shell nicht mehr bash sondern dash war.

insbesondere die if Abfragen scheinen nicht mehr so wie früher zu funktionieren.
Ein Beispiel:

Code: [Select]
if [ ${MSGFORMAT} == "MP3" ]; then
        MSGEXT="mp3"
elif [ ${MSGFORMAT} == "OGG" ]; then
        MSGEXT="ogg"
else
        MSGEXT="wav"
fi



funtioniert mit der bash, landet aber mit der dash immer im else.
Hat mich 3 Stunden ausprobiern gekostet, herauszufinden woran es lag. dabei war die Heilung simpel in der ersten zeile des scripts durch zufügen der buchstaben "ba" ander richtigen stelle. :wink:

Nun wüsste ich gern wie die richtige syntax für die dash aussieht.
Und warum ist jetzt die dash default? was kann die besser?

Offline DonKult

  • User
  • Posts: 278
    • http://donkult.wordpress.com
Frage zur dash
« Reply #1 on: 2011/01/15, 16:23:06 »
Die dash kann weniger (nämlich nur POSIX), deshalb ist sie etwas fixer. Es gibt viele viele Shells und nur wenige Arbeiten wie die bash, so das jeder der eine andere Shell verwenden möchte (oder muss) durch das "bashism" - also #!/bin/sh zu verwenden obwohl man #!/bin/bash meint - benachteiligt wird.

Was die if betrifft: [ ist keine Syntax, sondern ein Programm, siehe 'man test'! Und du verwendest falsche Argumente.
Code: [Select]
if [ "${MSGFORMAT}" = "MP3" ]; then
Wie du siehst, zwei Änderungen: Vergleiche werden nur mit einem Gleichzeichen gemacht (nicht wie in anderen Programmiersprachen mit ==. Das liegt daran, dass == eingeführt wurde um sie von Variablenzuweisungen unterscheiden zu können, aber das Problem hat man in POSIX-Shellscripten nicht.)
Zum zweiten würde ich Variable quotieren, sonst hast du 'nette' Effekte wenn die Variable leer ist oder aber z.B. Leerzeichen enthält…
(und achte akribisch auf das Leerzeichen nach dem [)
MfG. DonKult
\"Sprächen die Menschen nur von Dingen, von denen sie etwas verstehen, die Stille wäre unerträglich.\" ~ unbekannter Autor

Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
Frage zur dash
« Reply #2 on: 2011/01/15, 17:59:13 »
Hi DonKult,
hast du gerade einen Link parat der die signifikanten Unterschiede zwischen bash und dash erklärt. Interessieren würde mich auch wo dash klare Vorteile bringt bei der Shellprogrammierung.

Offline DonKult

  • User
  • Posts: 278
    • http://donkult.wordpress.com
Frage zur dash
« Reply #3 on: 2011/01/15, 19:23:32 »
Quote from: "Paketbeschreibung von dash"
Die Debian Almquist Shell (dash) ist eine POSIX-konforme Shell. Dash wurde von der ash abgeleitet.

Da sie Skripte schneller als die Bash ausführt, weniger Bibliotheksabhängigkeiten aufweist (und daher robuster gegen Software- oder Hardwarefehler ist), wird sie als standardmäßige System-Shell auf Debian-Systemen verwendet.

Das sie "schneller" ist (vorallem eben der Start) fällt natürlich kaum noch auf modernen Maschinen auf, aber im embedded Bereich oder generell langsameren Kisten kann das signifikant sein.

Für debian ist es vorallem wichtig, da so eine Shell existiert, die sich a) an POSIX und b) an die debian policy hält und c) nebenbei sich auf die Ausführung von Scripten konzentiert. Shells wie bash und zsh sind auch deswegen langsamer weil sie einen gewissen Komfort bieten wollen, den ein Shellscript nicht braucht. Eine programmierbare Tabvervollständigung gibt es daher z.B. in der dash nicht…

Es geht dabei aber weniger darum die Bash nicht mehr zu mögen, sondern einfach nur darum Script zu schreiben die sagen das sie Bash-script sind, wenn sie es den sind, da dass dann die Portabilität dieser Scripte erhöht.
Ein bisschen so wie C und C++ eben, da sagt auch keiner C und meint C++ und vise versa.

Ein paar der häufigeren bashisms finden sich im Ubuntu-Wiki https://wiki.ubuntu.com/DashAsBinSh
Ab und an kann auch checkbashisms aus dem devscripts Paket nützlich sein, dass spuckt aber auch sehr viele false positives aus…
MfG. DonKult
\"Sprächen die Menschen nur von Dingen, von denen sie etwas verstehen, die Stille wäre unerträglich.\" ~ unbekannter Autor