Hallo Michael, hallo Jan, hallo Leute, Am Donnerstag, 14. August 2003 10:30 schrieb Michael Matz:
On Thu, 14 Aug 2003, Jan Trippler wrote:
4. geschickte Ausweitung der Subshell ;-)
echo -e "a\nb\nc\nd" | { # ^----- hier startet die Subshell
Keine subshell, sondern ein command group. Insbesondere wird diese group im Environment der aktuellen Shell ausgewertet. [...]
Jein ;-) Richtig ist: Die geschweiften Klammern { } starten keine Subshell. Aber: das Ganze sitzt ja hinter einer Pipe, und dadurch wird eine Subshell gestartet.
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? Wenn nicht, wirft das Script Fehlermeldungen... Mir ist jedenfalls wesentlich wohler, wenn oben #!/bin/bash und nicht #!/bin/sh stehen darf ;-) Übrigens: vi markiert so Dinge wie $(...) als Fehler, wenn #!/bin/sh angegeben ist... 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? Gruß Christian Boltz -- Nix da, es werden bitte "funktionierende Pinguine" gebaut. ;-))) [Gerald Engl in suse-linux]