Entwickler-Ecke

Sonstiges (FPC / Lazarus) / Linux API - ShellApi einbinden ?!


Whynot - Mi 10.08.11 12:44
Titel: ShellApi einbinden ?!
So erstmal hallo :)
Ich habe mich jetzt in den letzten Tagen ein bisschen mit Delphi auseinandern gesetzt und habe schon Grundwissen von Python und Html ^^
Zudem benutze ich ein Ubuntu 11.04 mit Lazarus , was mit alles sehr gut gefällt ;)

Aber irgendwie haperts an der ShellApi mit dem zugehörigen Befehl Shellexecute . Irgendwie bekomme ich immer den Fehler :

unit1.pas(9,13) Fatal: Can't find unit ShellApi used by Unit1

das sagt mir irgendwie , dass er probleme hat die ShellApi lib oder wie das heißt einzubinden .
Aber mein eintrag lautet :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ShellApi;



Was mache ich falsch ? Muss ich die Shellapi vllt erst nachinstallieren oder wie funktioniert das ?

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


Xion - Mi 10.08.11 13:01

:welcome:

Ich hätte jetzt vermutet, dass die ShellAPI nur bei Windows funktioniert

http://www.mail-archive.com/lazarus@miraclec.com/msg20755.html hat folgendes geschrieben:

The shell commands are windows only and will be found in the windows unit.


Weiter unten habe ich diesen Link gefunden:
http://wiki.lazarus.freepascal.org/Executing_External_Programs


Whynot - Mi 10.08.11 13:32

danke schonmal !
Dachte shellapi ist linux :)

So habe mal das exampel ding reingehauen

Delphi-Quelltext
1:
SysUtils.ExecuteProcess( UTF8ToSys( '/full/path/to/binary'), '''' '', []);                    

und zu :

Delphi-Quelltext
1:
SysUtils.ExecuteProcess( UTF8ToSys( '/home/leon/Downloads/OpenSplit/split.sh'), '''' );                    

umgeändert.
In der shell steht eig. nur mkdir 'works' was auch funzt :)
Aber lazarus will nicht so recht , er spuckt mir nen Fehler 127 aus ?!

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
Moderiert von user profile iconMartok: Fullquote des letzten Beitrags entfernt


Xion - Mi 10.08.11 14:31

Die Doku dazu:
http://www.freepascal.org/docs-html/rtl/sysutils/executeprocess.html


Da ich keine Ahnung von Linux und wenig Ahnung von Lazarus hab, kann ich zu dem Fehler nur raten:
:arrow: Es ist der in der Doku angegebene Fehler (also ein Betriebssystem-Fehlercode).
:arrow: Du hast die SysUtils nicht eingebunden
:arrow: Du musst \ statt / verwenden.


LexXis - Mi 10.08.11 22:02

Hallo Whynot und :welcome: im Delphiforum!

ExecuteProcess artet meistens in ziemliches Gefrickel aus. Tu dir selbst den Gefallen, für deine Zwecke TProcess zu verwenden. Das ist IMHO einfacher zu handhaben und nötigenfalls auch cross platform ;)

Aber aufgepasst:
Zitat:

Note: TProcess is not a terminal/shell! You cannot directly execute scripts or redirect output using operators like "|", ">", "<", "&" etc. It is possible to obtain the same results with TProcess using pascal, some examples are below..

Important: You must specify the full path to the executable. For example '/bin/cp' instead of 'cp'. If the program is in the standard PATH then you can use the function FindDefaultExecutablePath from the FileUtil unit of the LCL.

Ergo kannst du damit damit dein Shellscript nur über Umwege verwenden. Aber solange diese nicht vom Benutzer verändert werden, sollte das ja kein größeres Problem darstellen und du kannst die Befehle hardcoden.

Gruß


Whynot - Mi 10.08.11 22:08

Hmm komisch ... ich kann .jar files oder vorkompillierte dateien damit starten : Shell nicht ?!


LexXis - Mi 10.08.11 22:42

Das interpretiere ich mal in das obige Zitat hinein ;)
Was geht (man beachte die Von-hinten-durch-die-Brust-ins-Auge-Methodik) wäre:

Quelltext
1:
SysUtils.ExecuteProcess('/usr/bin/gnome-terminal', '-e "pfad/zum/shellscript.sh"');                    


Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.
Also sehr sehr unsauber, die ganze Geschichte.
Vieleicht erklärst du kurz, warum du unbedingt ein Shellscript öffnen möchtest? Evtl lässt sich ja noch eine andere Lösung finden.

Gruß


Jakob_Ullmann - Fr 12.08.11 15:54

user profile iconLexXis hat folgendes geschrieben Zum zitierten Posting springen:
Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.


Dann kann ich immer noch xterm statt gnome-terminal oder konsole verwenden. Das dürfte ja bei allen Desktops gehen... (vorausgesetzt, X.org wird verwendet)

Abgesehen davon: gnome-terminal/konsole/xterm sind doch nur die Emulatoren. Warum nicht einfach /usr/bin/sh zum Ausführen verwenden? (EDIT: afaik ein Link auf die eigentliche Shell wie /usr/bin/bash)


LexXis - Fr 12.08.11 20:09

Oh, fein! Funktioniert tatsächlich. Wieder was gelernt :)

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
afaik ein Link auf die eigentliche Shell wie /usr/bin/bash

Kurz nachgeschaut: Korrekt.


Jakob_Ullmann - Sa 13.08.11 18:15

Ich finde es trotzdem verwunderlich, dass man Shellscripts nicht einfach so ausführen kann. Normalerweise sagt doch der Shebang am Anfang einer Datei, z. B.


Quelltext
1:
2:
3:
#!/bin/bash
  -- oder --
#!/bin/python


genau aus, mit welchem Programm es ausgeführt werden soll. :nixweiss:


LexXis - So 14.08.11 11:15

:oops:
Na jetzt rate mal, was bei meinen Test-scripts immer gefehlt hat.. Mit vorausgehendem shebang klappt´s ohne Probleme :roll:


Jakob_Ullmann - So 14.08.11 18:20

:angel:

Und ich hab schon gedacht, evtl. liegts am vergessenen chmod u+x.


Whynot - Do 18.08.11 12:38

user profile iconLexXis hat folgendes geschrieben Zum zitierten Posting springen:
Das interpretiere ich mal in das obige Zitat hinein ;)
Was geht (man beachte die Von-hinten-durch-die-Brust-ins-Auge-Methodik) wäre:

Quelltext
1:
SysUtils.ExecuteProcess('/usr/bin/gnome-terminal', '-e "pfad/zum/shellscript.sh"');                    


Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.
Also sehr sehr unsauber, die ganze Geschichte.
Vieleicht erklärst du kurz, warum du unbedingt ein Shellscript öffnen möchtest? Evtl lässt sich ja noch eine andere Lösung finden.

Gruß


Das mit Crossplatform ist mir bewusst :)
Bin aber nur Linux user und will für ein shell skript ein Gui mit delphi basteln , als "einsteiger projekt".
Dafür brauche ich einen Durchsuchen button bzw etw. in der art , wodurch dann der pfad in einer variable gespeichert wird und später dann mit dem execute command ausgeführt werden soll . Das heißt , ich müsste die variable in den execute process bekommen :) Schätze , das wird kompliziert o.O . Auf jeden fall schonmal ein großes danke , an alle die mir hier helfen ;) . Werde noch ein bisschen rumbasteln . Über hilfe freue ich mich natürlich weiter , der thread hier ist noch lange nicht tod ;)


Rocketeer - Mi 24.10.12 10:50

Bin leider auch nicht ganz der Linuxinsider, aber wenn ich mal nicht weiterkomme dann schau ich hier: http://linuxwiki.de/LinuxProgrammierung- Vielleicht hilft es dir..Viel Erfolg jedenfalls