[Erledigt] Frage zu Runcommand

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

[Erledigt] Frage zu Runcommand

Beitrag von MacWomble »

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 Sa 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.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Frage zu Runcommand

Beitrag von Socke »

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

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Frage zu Runcommand

Beitrag von Mathias »

Eine Möglichkeit wäre, die Zeile in eine *.sh Datei zu schreiben, und dies von Lazarus aufrufen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Frage zu Runcommand

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Frage zu Runcommand

Beitrag von Socke »

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

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Frage zu Runcommand

Beitrag von MacWomble »

Danke, das hilft weiter. Es funktioniert jetzt.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Mathias
Beiträge: 6162
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [Erledigt] Frage zu Runcommand

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

Antworten