[linux-l] Re: Mac und Linux

Oliver Bandel oliver at first.in-berlin.de
So Aug 6 00:13:23 CEST 2006


On Fri, Aug 04, 2006 at 09:12:51AM +0200, Volker Grabsch wrote:
> On Thu, Aug 03, 2006 at 05:17:49PM +0000, Rocco Rutte wrote:
> > >On Thu, Aug 03, 2006 at 11:47:58AM +0000, Rocco Rutte wrote:
> > 
> > >Ich rede nicht vom Programmierinterface, sondern
> > >von der Shell-Benutzung.
> [...]
> > >Wenn ich unter OS-X die bash habe, dann darf ich nur erst die switches
> > >und dann die anderen Args nehmen.
> > >Wenn ich unter Linux (Debian jedenfalls) die bash benutze, dann ist
> > >es egal, ob die switches am Anfang oder auch hinten folgen, denn
> > >das geht beides.
> > 
> > Naja, du weisst aber nicht, wie ls programmiert ist. Die Shell sortiert 
> > das auf gar keinen Fall um. Wenn, dann macht das getopt(). Und wenn 
> > ls(1) das benutzt (selbst als Shell-Builtin kann es das), dann bekommst 
> > du mit einer anderen C-Bibliothek zwei unterschiedliche getopt()s und 
> > demnach auch unterschiedliches Verhalten identischen (Bash-)Codes. Oder 
> > verstehe ich was falsch?
> 
> ACK. Oliver hat sich geirrt. Mit der Shell hat das überhaupt nichts
> zu tun.

Oliver hat sich nicht geirrt, denn er hat nicht behauptet, daß es etwas
mit der Shell zu tun habe.
Er hat lediglich beschrieben, was er beobachtet hat und ein paar
verwunderte Vermutungen geäussert, ohne zu behaupten, daß es daran läge.

Ich habe gesagt, was ich wann wie beobachtet habe und es nicht weiter
untersucht, weil es mir sooooo wichtig dann doch nicht war.



> Die Argumente werden erst von den einzelnen Programmen
> verarbeitet.

Dann ist "ls" unter Debian demnach != "ls" unter OS-X,
bzw. die beiden verhalten sich anders.

Das ist es ja, was ich behauptet habe: "ls * -l" geht unter Linux,
aber nicht OS-X. Warum dem so ist, war mir egal; entgegen meiner
sonst üblichen Argumentation aus Programmierer-Sicht hatte ich diesmal
100% User-Sicht aktiviert.



> Das einzige, was die Shell macht, ist das Ersetzen
> von "*" gegen alle Dateien und Verzeichnisse im aktuellen Verzeichnis.

Sie *könnte* die Argumente aber ersetzen.
Wenn sie dies täte, könnte es dafür möglicherweise Umgebungsvariablen geben.

Aber dem scheint wohl nicht so zu sein.

> 
> (d.h. aus "ls * -l" wird "ls datei1 datei2 verzeichnis1/ ... -l")
> 

Die Shell könnte das aber auch schon checken und dem Programm entsprechend
Konventionen (evtl. via Umgebungsvars aktiviert) übergeben.

Schliesslich ist die Shell auch nur ein Programm.
Und es startet andere via exec. Und exec bekommt Args.
Die könnte man ggf. vorbereiten und sie den Konventionen entsprechend
übergeben.

Als User kann man jedenfalls durchaus denken, daß es die Shell ist,
die das vorbereitet.

Es könnte aber auch eine Library sein, die die Args parsed. Und da
wären dann *diese* Komponenten diejenigen, die wohl den Unterschied
zwischen Linux und OS-X machen würden.
Das war ja, was hier in die Diskussionen geworfen wurde.
Wenn es die Lib ist, die das umwurschtelt, bleibt einem immer noch,
den argv selber zu parsen. Wenn man argv aber von der Shell
vorsortiert bekommt, kann man da nix machen.

Das Erweitern der Wildcards hattest Du ja als Besipiel angebracht.
Wenn das Programm von der Shell statt '*' die Namen der Files bekommt,
die auf ein Wildcard-Pattern matchen, dann nützt auch das argv selber-parsen
nix, denn argv enthält ja schon die vielen Namen.
Genauso könnte die Shell auch die Parameter-Reihenfolge ändern.
Würde die Shell das schon machen, wäre die Programmierung den Konventionen
entsprechend einfacher.
Allerdings sind dann bestimmte Dinge mit anderen Parameterreihenfolgen
nicht mehr (so einfach?) möglich. Dann wäre es sinnvoll, sowas über Umgebungsvariablen
steuerbar zu machen (mit dem Unterschied, daß die UMgebungsvariable für die Shell
selbst gilt, statt für die Programme, die sie ausführt).


Ciao,
   Oliver



Mehr Informationen über die Mailingliste linux-l