On Thu, 2003-08-14 at 22:06, Christian Boltz wrote:
Hallo Michael, hallo Jan, hallo Leute,
Am Donnerstag, 14. August 2003 10:30 schrieb Michael Matz:
On Thu, 14 Aug 2003, Jan Trippler wrote:
BTW: Du verwendest Backticks, um die Variable "$zaehler"eins hochzuzählen: zaehler=`expr $zaehler + 1` Das startet ein externes Programm in einer Subshell - wenig performant ;-)
aber portabel.
Siehe unten.
zaehler=$(($zaehler+1)) - und das ohne Subshell ;-) Eine weitere Variante ohne Subshell wäre let zaehler=$zaehler+1
AFAIK alles bash-spezifisch.
Falsch. Arithmetic expansion ist POSIX. Nur Solaris /bin/sh und ash (welche beide nicht POSIX konform sind) haben das nicht.
Woher soll ich wissen, ob die verwendete /bin/sh wirklich POSIX-konform ist?
Indem Du es vorab weisst ;) Im Ernst, ein gängiger Work-Around für derartige Probleme besteht darin vorauszusetzen, dass eine POSIX-konforme Shell verwendet wird und diese anstatt von /bin/sh zu verwenden.
Mir ist jedenfalls wesentlich wohler, wenn oben #!/bin/bash und nicht #!/bin/sh stehen darf ;-) ... was wiederum nicht portabel ist, da es /bin/bash eigentlich nur auf GNU-basierten Systemen gibt.
Auf nicht GNU-Systemen sind /usr/bin/bash, /usr/local/bin/bash oder <someobscurepath>/bin/bash weitaus häufiger anzutreffen. (Auf unseren Nicht-Linux-Boxen liegt die bash z.Zt. z.B. unter /amd/bin/bash) Ein Ausweg aus diesem Problem wäre ein kleines configure-script um das Script herum zu schreiben, dass nach einer bash sucht und die scripte entsprechend umschreibt.
Da fällt mir gerade ein: SuSE scheint in den init-Scripten eine POSIX-konforme /bin/sh vorauszusetzen, da Ihr da regen Gebrauch von $(...) usw. macht. Was spricht dagegen, einfach /bin/bash reinzuschreiben? Init-Scripte werden nur lokal verwendet, deshalb ist unter SuSE sichergestellt, dass /bin/sh == bash == "POSIX-konforme Shell" gilt.
Viel schwerwiegender ist hingegen der Gebrauch von Bash und POSIX-/bin/sh-Konstrukten in Per-User-Scripten (/etc/skel etc.), da User-Homes nicht unbedingt nur unter Linux und schon gar nicht nur lokal verwendet werden (z.B. weil User-Homes via amd/automount/afs transparent in einem heterogenen Netz gemountet werden). Ich weiss nicht, ob sich da bei SuSE was zum Positiven hin geändert hat. Bei älteren SuSE-Versionen lag da jedenfalls einiges im Argen. Ralf