Hallo, Am Thu, 22 Apr 2004, Martin Schmitz schrieb:
David Haller
writes: Am Wed, 21 Apr 2004, Martin Schmitz schrieb:
Am Mittwoch, 21. April 2004 18:00 schrieb David Haller: [..] Die originale ash auch und die bourne shell (/bin/sh) ebenfalls nicht!
Das koennen nur POSIX-shells, wie die aktuelle bash oder ksh.
Naja, ich dachte, die bourne shell sei schon POSIX kompatibel gewesen.
Nein. Und ich bezweifle, ob's damals POSIX ueberhaupt schon gab. Die bourne ist doch aus den fruehen 70ern...
Jetzt habe ich nochmal nachgesehen. Was ich möchte, ist einfach POSIX Konformität (und das schließt IMHO (()) mit ein).
AFAIK ja. Wobei POSIX von den verschiedenen shells (bash, ksh, zsh) unterschiedlich vollstaendig implementiert und unterschiedlich erweitert wird... Wirklich verlassen kann man sich nur auf bourne- features. Wer mehr will, der sollte EXPLIZIT per '#!/bin/bash' o.ae. eine POSIX-shell anfordern.
Wie es aussieht, hat BSD tatsächlich mal irgendwann vor langer Zeit die ash anstatt der original AT&T sh genommen und um POSIX und etwas mehr erweitert. Immerhin gab's die neue /bin/sh dann schon in 44BSD.
Das war dann aber wohl schon keine bourne mehr, sondern die BSD shell.
Wie SuSE darauf kommt, die Uralt-ash sei NetBSDs sh, ist mir ein Rätsel.
Das kann ich nicht nachvollziehen: ==== COPYRIGHT Copyright 1989 by Kenneth Almquist. DESCRIPTION Ash is a version of sh with features similar to those of the System V shell. ==== $ rpm -qf `which ash` ash-0.2-151 $ rpm -q --queryformat "%{description}" -f `which ash` | head -2 NetBSD's ash (Almquist sh) for Linux is a small (62K - no job control) Bourne-compatible shell. Great for machines with Beachte: NetBSD sh != NetBSD ash
Ach ja, und NetBSDs sh ist doch keine ksh, aber daran angelehnt. Eine pdksh (als ksh) wird aber auch mitgeliefert. Standardshell ist übrigens csh. ;-)
Ja.
Wie soll die denn /bin/sh ersetzen können!? Warum nimmt man nicht die richtige NetBSD sh (IMHO eine ksh)?
pdksh? Das ist auch keine bourne shell sondern eine POSIX shell. Die kannst du nicht als Vergleich verwenden.
Naja, aber sowas vermisse ich bei SuSE. Eine kleine POSIX shell, die keine *zusätzlichen* Features mitbringt und sich als /bin/sh einsetzen läßt.
Das ist dann aber, genausowenig wie die bash, eine bourne-shell. Sinnvoller waere: 'ln -sf /bin/ash /bin/sh'.
Und wenn man dafür skriptet, dann sollte das überall laufen, wo es eine /bin/sh gibt, _zumindest_ wenn diese POSIX konform ist.
Ruft man die bash als sh auf (per symlink /bin/sh z.B.), dann verhaelt sie sich POSIX-konform (d.h. ohne GNU/Bash Erweiterungen). Such mal in man bash nach 'as sh' und 'posix'... Eine schlankere POSIX-shell als die bash (im POSIX-mode) ist wohl die pdksh.
Und genausowenig eine ksh bzw. generell POSIX-shell. Die ash (die kein (( )) kann!) ist von den frei erhaeltlichen am naechsten an der Bourne shell dran. Also teste damit.
Vermutlich die beste Idee. Aber auf Arithmetic Expressions verzichten zu müssen ist schon hart. ;-)
Musst du nicht. help 'let' (wobei das die ash wohl auch nicht kennt) und 'help expr'... $ ash -c 'echo `expr 1 + 1`' 2 Ausserdem gibt's da ja so nette Tools wie 'bc' und 'dc', die sich prima in der shell verwenden lassen... $ ash -c 'echo "ibase=8; obase=16; 755;" | bc' 273 $ ash -c 'echo "ibase=8; obase=2; 755;" | bc' 111101101 ^^^^^^^^^ rwxrwxrwx Ansonsten (s.u.): verwende einfach explizit(!) /bin/bash oder /bin/ksh oder was auch immer. Weil ich meist zu faul bin, auf bourne-Kompatibilitaet zu testen haben praktisch alle meine aktuelleren scripte (ausser trivialem Kram, der z.B. nur if, ps, grep und exec verwendet) als erste Zeile ein #! /bin/bash (oder '#! /usr/bin/gawk -f', oder '#! /usr/bin/sed -f' oder '#! /usr/bin/perl -w').
Ist /bin/test bzw. /bin/[ eigentlich auch in POSIX definiert.
Nein. /usr/bin/test aber. Wie's mit /usr/bin/[ aussieht weiss ich nicht, ich hab den symlink bei mir geloescht (IIRC). Krass aber das hier: feersum:~# ls -li /usr/bin/{test,[} 430386 -rwxr-xr-x 1 root root 29359 2004-03-29 16:03 /usr/bin/[ 430436 -rwxr-xr-x 1 root root 27577 2004-03-29 16:03 /usr/bin/test ^^^^^! *HAEHHHH???* Isch glaub, et hakt (nein, nicht die groesse, die sind ungestripped, das ist ok, aber dass das zwei unterschiedliche binaries sind!) Das ist die aktuellste SuSE, die ich hier im Zugriff habe... Bei meiner SuSE 6.2 (mein nach wie vor Hauptsystem) war /usr/bin/[ ein symlink auf /usr/bin/test. Ausserdem haben die POSIX shells wohl auch immer ein test-builtin: dh@slarty: ~ $ ksh -c 'type test' ### == pdksh 5.2.14 test is a shell builtin dh@slarty: ~ $ bash -c 'type test' ### == bash 2.03.0(1)-release test is a shell builtin dh@slarty: ~ $ sh -c 'type test' ### == bash --posix 2.03.0(1) test is a shell builtin dh@slarty: ~ $ zsh -c 'type test' ### zsh 3.0.5 test is a shell builtin dh@slarty: ~ $ ash -c 'type test' ### ash 0.2 type: not found ### sic! dh@slarty: ~ $ sash -c 'type test' ### sash 3.4 type: No such file or directory ### sic! dh@slarty: ~ $ sash -c 'which test' /usr/bin/test Achso, ne csh hab ich hier auch, die verwende ich aber nicht. Zumal man csh so oder so nur interaktiv verwenden sollte. Fazit: bourne != POSIX /bin/sh -> bash ~= POSIX != /bin/bash ash != POSIX ash != {bash,zsh,{,pd}ksh} ash ~= bourne csh != {bourne,POSIX,bash,sh,ash,zsh,*ksh*} Und ja, ich hab auch Erfahrung mit ner ksh != pdksh, genauer ner ksh von SunOS 5.x... Will man nicht unbedingt als interaktive shell. Genausowenig wie man, selbst als vitischist, den vi-mode der libreadline in der bash will. YMMV.
PS: liest du dcous?
leider nein. Aber danke für die Infos.
Tu das. Google in der Gruppe mal (in den letzten 3 Monaten) nach "POSIX"... -dnh PS: an alle: lest mal man -P'less +/^READLINE' bash bzw. uebersichtlicher: info readline -> Command Line Editing -> Readline Interaction das macht sich in der bash jederzeit nuetzlich, und wer dann mal den (X|GNU)Emacs ausprobieren will, der hat's nicht mehr schwer... -- If you haven't got time to RTFM, you haven't got time to whine on this mailing list.