shell() antwortet mit Fehler

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

shell() antwortet mit Fehler

Beitrag von rammi22 »

Moin,

OS: Ubuntu 22.04
LO: 7.3.5.2

Ausführung von shell() erzeugt Fehler:
BASIC-Laufzeitfehler
Datei nicht gefunden

Code: Alles auswählen

Sub CallScanReader
 # msgbox "Hello World!"
 msbox Shell("./index.sh", "", 0)
End Sub
Eigentlich will ich damit ein PHP-Skript aufrufen. Der Aufruf erzeugte denselben Fehler. Zu Testzwecken habe ich das Shell-Skript mit einem echo "Hello World"

Skript liegt im selben Verzeichnis wie das Tabellen-Dokument

folgende Pfade habe ich probiert:
  • index.sh
  • ./index.sh
  • /home/rammi/Schreibtisch/PROJECTS/Scanner/Post
Warum findet er das Skript nicht?
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

Re: shell() antwortet mit Fehler

Beitrag von rammi22 »

Ich habe das Script etwas erweitert

Code: Alles auswählen

Sub CallScanReader
 script = "/home/rammi/Schreibtisch/PROJECTS/Scanner/Post/index.sh"
    MsgBox FileExists(script)
    MsgBox Shell(script)
End Sub
FileExists ergibt true
Shell wirft weiterhin
BASIC-Laufzeitfehler
Datei nicht gefunden
Mir scheint, widersprüchlich?!
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: shell() antwortet mit Fehler

Beitrag von Toxitom »

hey Rammi,

shell() ist so ne Sache und ein echtes Risiko.... aber ok.

der Aufruf ist wie folgt (siehe auch Hilfe):
Shell (Pathname As String[, Windowstyle As Integer][, Param As String][, bSync])
und shell() startet ein Programm!!

Das was Du übergibst ist eine Datei - kein Programm. Auch wenn Dein Dateityp im System mit einem Programm verknüpft ist....

Hier mal ein Beispiel, wie Du eine PDF Datei per shell-Befehl anzeigen lassen kanst:

Code: Alles auswählen

sub shelltest
  s = "C:\Users\Tom\Desktop\hallo.pdf"
  p = "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"
  shell(p,"", s)
end sub
So ähnlich wird das auch mit der *.sh Datei funktionieren.

Noch etwas: Shell() benötigt keine Msgbox - liefert ja auch nix zurück.

aber, der Basic-Shell Befehl sollte eh hinter dem UNO -Shell Service zurükstehen. Der ist stabiler und immer vorzuziehen. Da solltest Du auch die Datei direkt aufrufen können - wenn die Datei-erweiterung im System mit eien Programm verknüpft ist.

Also z.B. so:

Code: Alles auswählen

sub shelltest
  oShell = createUnoService("com.sun.star.system.SystemShellExecute")
  s = "C:\Users\Tom\Desktop\hallo.pdf"
  oShell.execute(s,,0)
end sub
VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: shell() antwortet mit Fehler

Beitrag von Hiker »

Funktioniert der Aufruf der .sh-Datei aus einem Terminal

Worauf ich eigentlich ziele: unter Unix müssen Dateien via chmod als ausführbar markiert werden. "File not found" könnte dann bedeuten "Keine ausführbare Datei gefunden".

Ansonsten müsste zumindestens der absolute Pfad klappen. Bei relativen musst Du klären, welches aktuelle Verzeichnis gilt. Bei Desktop-Anwendungen ist das nicht eindeutig.
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

Re: shell() antwortet mit Fehler

Beitrag von rammi22 »

Toxitom hat geschrieben: So, 18.09.2022 12:38 ...

Code: Alles auswählen

sub shelltest
  oShell = createUnoService("com.sun.star.system.SystemShellExecute")
  s = "C:\Users\Tom\Desktop\hallo.pdf"
  oShell.execute(s,,0)
end sub
VG Tom
Hab ich mal so umgebaut

Code: Alles auswählen

Sub CallScanReader
  starten = createUnoService("com.sun.star.system.SystemShellExecute")
  ret = starten.execute("/home/rammi/Schreibtisch/PROJECTS/Scanner/index.sh", "", 0)   
  MsgBox ret  
End Sub
Die Messagebox ist leer, auch keine Fehlermeldung. Das .sh Skript, müsste mMn in der MsgBox Hello World ausgegeben:

Code: Alles auswählen

#!/bin/sh
# This is a comment!
echo Hello World       # This is a comment, too!
Hiker hat geschrieben: So, 18.09.2022 16:30 Funktioniert der Aufruf der .sh-Datei aus einem Terminal
Ja
Hiker hat geschrieben: So, 18.09.2022 16:30 Worauf ich eigentlich ziele: unter Unix müssen Dateien via chmod als ausführbar markiert werden. "File not found" könnte dann bedeuten "Keine ausführbare Datei gefunden".

Ansonsten müsste zumindestens der absolute Pfad klappen. Bei relativen musst Du klären, welches aktuelle Verzeichnis gilt. Bei Desktop-Anwendungen ist das nicht eindeutig.
Rechte sind gesetzt

Code: Alles auswählen

ls -l index.sh 
-rwxrwxrwx 1 rammi rammi 84 Sep 18 10:32 index.sh
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: shell() antwortet mit Fehler

Beitrag von Toxitom »

Hey Rammi,
...Das .sh Skript, müsste mMn in der MsgBox Hello World ausgegeben: ...
Nein! Hab ich doch schon geschrieben: Der Shell-Befehl liefert keinen Rückgabewert !! (Außer 0/1 - erfolgreich, nicht erfolgreich) - der Service liefert erst recht keinen!

Dein "Hello World" wird Dir dann im Terminal ausgegeben - sonst nirgends.

Du kannst den Shell-Service nicht nutzen, um irgendwelche Daten zu erhalten - lediglich kannst Du andere Programme starten!

Ich weiss ja nicht, was Du vorhast - aber so geht das nicht;)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

Re: shell() antwortet mit Fehler

Beitrag von rammi22 »

Toxitom hat geschrieben: So, 18.09.2022 17:34 ...

Ich weiss ja nicht, was Du vorhast - aber so geht das nicht;)

VG
Tom
Ich versuch es mal mit einfachen Skripts, die richtige Aufgabe des .php Skript ist natürlich umfangreicher
  • Schaltfläche im calc-Dokument soll ein .php Skript ausführen
  • .php soll einen Text in eine Datei schreiben
  • Nach Erfolg soll eine Rückmeldung vom .php-Skript ausgewertet werden
.php

Code: Alles auswählen

<?php
$file = "test.txt";
file_put_contents($file, 'test');

echo 'done';
Nach Ausführung folgenden Skript ist keine test.txt geschrieben und in der MsgBox "0" ausgegeben:

Code: Alles auswählen

Sub CallScanReader
 script = "/home/rammi/Schreibtisch/PROJECTS/Scanner/Post/index.php" 
 php = "/usr/bin/php"
 result = Shell(php, "", script)
 MsgBox result
End Sub
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: shell() antwortet mit Fehler

Beitrag von Karolus »

Hallo

Mal "zurück auf Start" … du versuchst das alles ursprünglich via "klick auf Button" … Ja??

Dann geh an der Stelle nochmal in den Entwurfsmodus und entferne die derzeitige Zuordnung, stattdessen wählst du unter :
→Allgemein→Aktion : Dokument/Webseite öffnen und direkt unterhalb →→URL /home/rammi/Schreibtisch/PROJECTS/Scanner/Post/index.php
und hier gilt ebenfalls diese …index.php muss ausführbar sein, und z.B bei Doppeklick aufs Dateisymbol das gewünschte tun, (was immer das ist…?)
Zuletzt geändert von Karolus am So, 18.09.2022 18:14, insgesamt 1-mal geändert.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: shell() antwortet mit Fehler

Beitrag von Toxitom »

hey Rammi,

tia, dann mach das halt so und teste Schritt für Schritt.

- Funktioniert das php-Skipt wie gewünscht bei manuellen Aufruf?
- statt echo "done" lass dir ne File schreiben in eine temp-Umgebung. Vorher solltest Du natürlich eine evt. schon vorhandene Datei löschen.

das alles hat zunächst nix mit LO zu tun.

Nächster Schritt:

LO Makro -> Aufruf des Shellbefehls (vorher vielleicht die evt. vorhandenen Flagdatei im Temp-ordner löschen?) mit den Parametern
shell(php,"", script, true) ... der vierte Parameter steuert das Verhalten des Basic-Programms. Bei True wartet das Basic-Programm, bis der Shell-Aufruf fertig ist!
Dann prüfen ob die Tempdatei vorhanden ist und evt. den Inhalt auswerten.

So wäre das mögliche Vorgehen.

VG
Tom

PS: Der Tipp von Karolus vereinfacht den Shellaufruf - den kannste dann weglassen. Allerdings wird auch dort dann keine "Erfolgsmeldung" ausgewertet.
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

Re: shell() antwortet mit Fehler

Beitrag von rammi22 »

Toxitom hat geschrieben: So, 18.09.2022 18:13 hey Rammi,

tia, dann mach das halt so und teste Schritt für Schritt.

- Funktioniert das php-Skipt wie gewünscht bei manuellen Aufruf?
Ja, im Termianl ausgeführt klappt das (ich hab noch ein print_r mit "done" hinzugefügt), test.txt wird geschrieben

Code: Alles auswählen

$ /usr/bin/php index.php
done
Nächster Schritt:
Toxitom hat geschrieben: So, 18.09.2022 18:13 LO Makro -> Aufruf des Shellbefehls (vorher vielleicht die evt. vorhandenen Flagdatei im Temp-ordner löschen?) mit den Parametern
shell(php,"", script, true) ... der vierte Parameter steuert das Verhalten des Basic-Programms. Bei True wartet das Basic-Programm, bis der Shell-Aufruf fertig ist!
Dann prüfen ob die Tempdatei vorhanden ist und evt. den Inhalt auswerten.

Code: Alles auswählen

Sub CallScanReader
 script = "/home/rammi/Schreibtisch/Scanner/index.php" 
 php = "/usr/bin/php"
 Shell(php, "", script, true)
End Sub
Es wird keine test.txt geschrieben
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

Re: shell() antwortet mit Fehler

Beitrag von rammi22 »

Karolus hat geschrieben: So, 18.09.2022 18:08 ...
→Allgemein→Aktion : Dokument/Webseite öffnen und direkt unterhalb →→URL /home/rammi/Schreibtisch/PROJECTS/Scanner/Post/index.php
und hier gilt ebenfalls diese …index.php muss ausführbar sein, und z.B bei Doppeklick aufs Dateisymbol das gewünschte tun, (was immer das ist…?)
Damit öffnet sich die Datei im Editor, Rechte sind gesetzt zum ausführen

Code: Alles auswählen

ls -l index.php 
-rwxrwxrwx 1 rammi rammi 113 Sep 18 18:19 index.php
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

Re: shell() antwortet mit Fehler

Beitrag von rammi22 »

Karolus hat geschrieben: So, 18.09.2022 18:08 Hallo

Mal "zurück auf Start" … du versuchst das alles ursprünglich via "klick auf Button" … Ja??
...
Ich dachte nicht, das dabei Komplikationen auftreten: Button click > Event löst Skript aus > Skript antwortet > Antwort wird ausgewertet :-(
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
Karolus
********
Beiträge: 7438
Registriert: Mo, 02.01.2006 19:48

Re: shell() antwortet mit Fehler

Beitrag von Karolus »

Hallo

An der Stelle kann ich jetzt nur empfehlen, vergiss BASIC und arbeite gleich mit Python, in 95% brauchst du zunächst mal das …php dingens nicht (für die restlichen 5% hat python ein subprocess-modul das auch vernünftig mit anderen prozessen komunizieren kann, und im übrigen für all das was du im weiteren noch so zu scripten gedenkst wohl die bessere Wahl)
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
rammi22
****
Beiträge: 126
Registriert: Mo, 26.03.2012 02:59

Re: shell() antwortet mit Fehler

Beitrag von rammi22 »

Karolus hat geschrieben: So, 18.09.2022 18:45 ...in 95% brauchst du zunächst mal das …php dingens nicht...
Na ja, ich bin PHP-Entwickler und das auszuführende Skript löst eine umfangreiche PHP-Applikation aus. Da fehlt Wissen und Zeit, alles in ein Python-Skript zu bauen.

Abgesehen davon denke ich, ist es total egal ob php oder sonst irgendwas. So ein Aufruf über eine UI wie OO sollte immer funktionieren.
Ich denke, eventuell sind es die Pfade zu den Skripten, bei vielen Beiträge zum Thema shell() wird ja ein Windows-Nutzer vorrausgesetzt...

Ich habe das .php-Skript mit einem .sh Skript ausgetauscht, auch hier wird über das Terminal eine test.txt geschrieben aber über die Makro-Steuerung passiert nix

Code: Alles auswählen

Sub CallScanReader
 sh_script = "/home/rammi/Schreibtisch/Scanner/index.sh" 
 sh = "/usr/bin/sh"
 Shell(sh, "", sh_script, true)
End Sub
Das .sh Skript

Code: Alles auswählen

#!/bin/sh
# This is a comment!
echo Hello World ahb > ./test_sh.txt      # This is a comment, too!
Gruss Rammi
----------------------------------------------------
Linux 22.04 | Win11 | LibreOffice 7.3.5.2
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: shell() antwortet mit Fehler

Beitrag von Hiker »

Frage: was ist das Verzeichnis . also das aktuelle Verzeichnis ?

Ich würde versuchen einen absoluten Pfad zu setzen,
oder mal ein Programm wie Okular/evince im skript aufzurufen, was man nicht übersieht. Ausserdem könnte man LibreOffice vom Terminal aufrufen, dann siehst Du auch eine Ausgabe des sh- Skripts.
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Antworten