From: amk@zikzak.in-berlin.de (Andreas M. Kirchwitz)
Newsgroups: de.comp.sys.amiga.misc
Subject: Re: Kampf der Shell-Giganten
Date: Tue, 01 Sep 1992 10:51:44 GMT
Reply-To: amk@zikzak.in-berlin.de (Andreas M. Kirchwitz)
 <kHrBr*714@kbsaar.saar.de>
Organization: Department of Fun & Games
X-Newsreader: Arn V1.00 beta rel2

In article <kHrBr*714@kbsaar.saar.de>, Franz-Josef Reichert writes:

> 	System() liefert 0 fuer Erfolg, -1 fuer einen aus
> welchen Gruenden auch immer nicht einzurichtenden CLI-Prozess und
> [...]
> 	Fuer "Unknown command" erzeugt der initiierte CLI-Prozess
> uebrigens einen Returncode von 10.

Exakt darauf wollte ich hinaus.
Dieses Verhalten ist mir bereits nach wenigen Minuten Rumprobieren
mit System() unangenehm aufgefallen. Warum hat sich da noch nie je-
mand anders drueber beschwert?

> -1 wird man erst dann zu Gesicht
> bekommen, wenn der _CLI-Prozess_ (NICHT die innerhalb seines Kontext'
> ausgefuehrte KOMMANDOZEILE) an mangelnden Systemressourcen scheitert.

Ja, und damit ist der RC von System() fuer den einfachen Gebrauch
absolut witzlos.  Der RC koennte z.B. "-1" fuer "unknown command"
liefern und "-2" fuer (sinngemaess) "no shell process". Man koennte
ja vielleicht auch aehnlich OpenScreen() ein extra TagItem fuer den
ausfuehrlichen Fehler-Return-Code angeben.  Alle RCs groesser oder
gleich 0 sollten ausschliesslich vom erfolgreich gestarteten Kommando
kommen.

Die "10" einfach in die normalen RCs einzustreuen, ist meines Erachtens
voellig daneben.  Damit fehlt es System() ganz klar an der noetigen
Abstraktion.  Schon wieder kommt der Programmierer nicht auf einfachem
Wege an den echten Return-Code des gestarteten Kommandos ran...
Die Dokumentation (Autodocs) ist in dieser Hinsicht sowohl ungenau
als auch falsch:

	SystemTagList -- Have a shell execute a command line (V36)

Hieraus _koennte_ man das mit der "10" noch rauslesen/begruenden...
(dieser dezente Hinweis ist fuer den normalen Programmierer, der sich
 mit den Interna nicht so auskennt, aber natuerlich leicht zu ueber-
 sehen)

	Similar to Execute(), but does not read commands from the input
	filehandle.  Spawns a Shell process to execute the command, and
	returns the returncode the command produced, or -1 if the command
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Und hier ist jetzt offensichtlich der Fehler, wo sich System()
nicht an die eigene Spezifikation haelt :-(

	could not be run for any reason.  The input and output filehandles
	will not be closed by System, you must close them (if needed) after
	System returns, if you specified them via SYS_Input or SYS_Output.

Es ist klar vom RC des _Kommandos_ die Rede.  NICHT VON DER SHELL!
"-1", falls das Kommando nicht gestartet werden konnte aus irgendeinem
Grund... also auch ein nicht zu erzeugender Shell-Prozess.  Dass "-1"
als Fehlerbeschreibung nicht ausreicht (z.B. wenn asynchron gestartet
werden soll) ist mir inzwischen einsichtig.  Aber es gibt haufenweise
ANDERE Wege, die Fehlerursache zu spezifizieren... dazu muss man nicht
mit dem RC rumpfuschen.

Es ist ganz einfach ein Design-Fehler bei der System()-Funktion.

System() ist zwar schon ein Fortschritt gegenueber Execute() fuer den
normalen Programmierer.  Aber noch immer nicht brauchbar, wenn man den
RC benoetigt und dafuer nicht Umwege machen will.

Vielleicht hab ich ja uebersehen, wie man _doch_ an den RC kommt.
Dann waer's nett, wenn es mir jemand erklaeren koennte...
(auch wenn's etwas aufwendiger ist ;-)

	Aber systemkonform muss es sein...   Andreas

--
IRC-Nick: | Andreas M. Kirchwitz, Seesener Str. 69, W-1000 Berlin 31, Germany
  `bonzo' | Phone: +49 (0)30 873376, Mail: amk@{zikzak.in|cs.tu|fu}-berlin.de