[Erledigt] Frage zu Runcommand

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

[Erledigt] Frage zu Runcommand

Beitragvon MacWomble » 24. Nov 2017, 20:07 [Erledigt] Frage zu Runcommand

Hallo,

Alles in Linux-Mnt 18 !

Ich versuche aus meinem Programm einen Befehl in der Konsole abzusetzen, was aber nicht funktioniert.

Code: Alles auswählen
RunCommand('cat ' + QuellDatei + ' | formail -X FROM:  -X subject > ' + '/tmp/header.txt' , Result)


Gebe ich die vom Programm erzeugte Zeile in der Konsole ein, wird die Datei angelegt.
Ich vermute, dass es mit der Pipe zusammen hängt.

Vielleicht hat auch jemand eine bessere Lösung für mein Problem. Ich habe eml-Dateien mit und ohne Anhänge, aus welchen ich den Header, den Body (Text, nicht HTML) sowie möglichst die entpackten Anlagen benötige.
Alternativ wäre auch das Umwandeln der eml in pdf eine sehr gute Lösung, leider habe ich nichts hierzu gefunden (Außer das Speichern als pdf im Mailprogramm , was aber keine brauchbare Löung darstellt. Es geht täglich um dutzende Mails!)

Nur da im Moment die Zeit drängt wollte ich dies mit formail und munpack provisorisch einbauen.
Zuletzt geändert von MacWomble am 25. Nov 2017, 07:35, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 499
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.40 (FPC 3.1.1 Rev 38039) | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Socke » 24. Nov 2017, 20:39 Re: Frage zu Runcommand

RunCommand weist das Betriebssystem an, einen Prozess zu starten, mehr nicht. Insbesondere kann es keine Dateien lesen oder schreiben.
Deine Shell hingegen kann wesentlich mehr, z.B. durch die Pipe-Symbole ein paar Dateihandles bei den gestarteten Prozessen austauschen, sodass diese direkt in die angegebenen Dateien schreiben bzw. den Output eines anderen Prozesses als Input bekommen.

Du kannst entweder deine Shell starten (/bin/sh -c cat [...]) oder aber aber die Standardausgabe und -eingabe der Prozesse selbst umlenken - hierzu gibt es im Wiki ein paar Beispiele.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2497
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Mathias » 24. Nov 2017, 20:52 Re: Frage zu Runcommand

Eine Möglichkeit wäre, die Zeile in eine *.sh Datei zu schreiben, und dies von Lazarus aufrufen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3867
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 24. Nov 2017, 21:07 Re: Frage zu Runcommand

Ich habe gerade etwas probiert, wie du das mit dem Pipe lösen könntest. Folgendes Programm macht folgendes:
Code: Alles auswählen
cat *.pas|sort 

Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
  AProcess: TProcess;
  AStringList: TStringList;
 
begin
  AProcess := TProcess.Create(nil);
  AProcess.Executable := '/bin/cat';
  AProcess.Parameters.Add('unit1.pas');
  AProcess.Parameters.Add('unit2.pas');
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
 
  AStringList := TStringList.Create;
  //  Memo1.Lines.LoadFromStream(AProcess.Output);
  AStringList.LoadFromStream(AProcess.Output);
  AStringList.SaveToFile('temp.txt');
 
 
  AProcess.Executable := '/usr/bin/sort';
  AProcess.Parameters.Add('temp.txt');
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
 
  Memo1.Lines.LoadFromStream(AProcess.Output);
 
  AStringList.Free;
  AProcess.Free;
end;   
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3867
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Socke » 24. Nov 2017, 23:41 Re: Frage zu Runcommand

Mathias hat geschrieben:Ich habe gerade etwas probiert, wie du das mit dem Pipe lösen könntest.

Das geht aber nur begrenzt gut. Wenn die Dateien zu groß sind, wird die Pipe von cat bis zum Maximum gefüllt. Dann wartet cat darauf, dass die Pipe geleert wird, was dein Programm aber nicht machen kann, da es dank poWaitOnExit darauf wartet, dass cat sich beendet. Das nennt man Deadlock.
Im oben verlinkten Wiki-Artikel ist ein Beispiel, wie man das umgehen kann und es gibt auch eine Variante von RunCommand, die die gesamte Ausgabe des Prozesses ausliest.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2497
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon MacWomble » 25. Nov 2017, 07:35 Re: Frage zu Runcommand

Danke, das hilft weiter. Es funktioniert jetzt.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 499
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 18.3 Cinnamon / CodeTyphon Generation V Plan 6.40 (FPC 3.1.1 Rev 38039) | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Mathias » 25. Nov 2017, 17:23 Re: [Erledigt] Frage zu Runcommand

Das geht aber nur begrenzt gut. Wenn die Dateien zu groß sind, wird die Pipe von cat bis zum Maximum gefüllt. Dann wartet cat darauf, dass die Pipe geleert wird,
Das kannte ich nicht, ich dachte, die Pipe sei unbegrenzt, da das OS dies mit einer Temporären Datei löst. Ich hatte dies von MS-DOS im Hinterkopf.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3867
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Warf und 3 Gäste

porpoises-institution
accuracy-worried