PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Exec bzw. Parameter für Lynx


Chton
24.01.2008, 21:38
Hallo !


Unter Linux möchte ich per Pascal - Programm "Lynx" aufrufen und den Output von Lynx in eine Datei umleiten.

Der Exec-Befehl sieht so aus:
Exec('/usr/bin/lynx', 'http://www.google.de -dump > ./out.txt');

Damit aufgerufen meckert Lynx, daß es die Dateien ">" und "./out.txt" nicht öffnen kann.

Can't Access 'file://localhost/root/>'
und
Can't Access 'file://localhost/root/out.txt'


Exec('/usr/bin/lynx', 'http://www.google.de -dump');
funktioniert dagegen einwandfrei - der Output gelangt auf Std-Out also der Bildschirm.

Wenn ich dagegen ein Skript anlege, "execute" und mit "chmod +x execute" ausführbar mache mit der einen Zeile:
/usr/bin/lynx http://www.google.de (http://www.google.de/) -dump > ./out.txt
dann funktioniert das einwandfrei.
Die Datei ./out.txt wird von Lynx angelegt und mit erwartetem Inhalt gefüllt .

Wie bekomme ich doch noch den Output in eine Datei mit meinem Pascal-Programm hin ?

Kann doch nur eine dusselige Kleinigkeit sein ?!? :-)

Vielen Dank !!

MfG
Rafael

Hier das ganze Programm:

Program execute;
uses Crt, Dos;
CONST
Str1 = '/usr/bin/lynx';
Str2 = 'http://www.google.de -dump';
{> ./out.txt';}
begin
ClrScr;
WriteLn('Executing: ' + Str1 + ' ' + Str2);
Writeln('Press any key ...');
Readln;
Exec(Str1, Str2);
WriteLn('Program returned with ExitCode ',Lo(DosExitCode));
Writeln('Press any key ...');
Readln;
end.


Mr.Homm
24.01.2008, 23:33
Das Umleiten der Ausgabe von Lynx mittels > ist eine Möglichkeit, die dir deine Shell zur Verfügung stellt. Wenn du deinen Befehl (/usr/bin/lynx http://www.google.de -dump > ./out.txt) so in der Shell eingibst, dann wird von der Shell die Ausgabe von Lynx in die Datei umgeleitet. Der Befehl Lynx bekommt von dem > und dem Dateinamen danach nichts mit. Die werden von der Shell vor dem Aufruf von Lynx entfernt. Damit weißt du jetzt wieso Lynx einen Fehler auswirft. Bleibt die Frage wie kannst du die Ausgabe von Lynx umlenken. Ich könnte mir zwei Möglichkeiten denken: 1) Du führst nicht Lynx sondern deine Shell aus und gibst ihr den Lynx-Aufruf als Parameter mit. Dann lenkt die Shell wie sonst auch die Ausgabe in die Datei um. Für die Bash würde Exec(.) '/bin/bash' als Programm bekommen und '-c "/usr/bin/lynx http://www.google.de -dump > ./out.txt"' als Parameter. 2) du verbiegst die Ausgabe von deinem Pascalprogramm während es lauft. Du änderst deine erste Zeile deines Programmes in Program execute(input, output);. Damit solltest du die Eingabe- und Ausgabe-Ströme benannt haben. Die sind vom Typen TEXT, was für eine Datei aus Chars steht. Bevor du lynx mittels Exec(.) aufrufst (in der Form die es jetzt bei dir ist, aber ohne > ./out.txt) setzt du die Variable output auf eine TEXT-Datei, die du zuvor geöffnet hast. Wenn dann Exec(.) die Variable output benutzt, um die Ausgabe zu drucken, sollte diese (die Ausgabe) in der Datei landen. Wenn du zuvor den alten (ursprünglichen) Wert von output gesichert hast, kannst die ihn nach Exec(.) wieder herstellen und wieder normale Ausgabe auf den Bildschirm zaubern.

Ich habe kein Pascal und kann nicht testen, ob die beiden Vorschläge funktionieren. Beim ersten glaube ich eher, dass er geht.

Diogenes
25.01.2008, 17:31
Chton, welches Pascal nimmst Du denn?
Wenn dur den Free Pascal Compiler (http://www.freepascal.org/) verwendest, dann probier mal Executing External Programs (http://wiki.lazarus.freepascal.org/Executing_External_Programs) aus.

Chton
25.01.2008, 19:51
@ Mr.Homm
Instruktiv und zielführend. Dein erster Vorschlag funktioniert.
Deinen zweiten habe ich erstmal nicht ausprobiert. Dieser erscheint mir unnötig kompliziert - vielleicht später mal. Vermute, richtig kapiert habe ich den erst, wenn ich es praktisch ausprobiert habe ...

1000Dank !!


@ Diogenes
Sehr interessant. Ich setze FreePascal ein und kannte ExecuteProcess bzw. TProcess noch nicht. Sehr wahrscheinlich werde ich bald erste Versuche damit machen.

Auch hier herzlichen Dank !!

MfG
Rafael
:)