BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[Gelöst] Shell()-Befehl unter Linux und bsync-Parameter

Alles zur Programmierung im LibreOffice.
herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von herz4 » Do 11. Mär 2021, 19:32

Ich danke Dir abermals gogo.

"-e" war der richtige Schalter, so wartet das Terminalfenster auf eine Eingabe. Bei "-c" erscheint es gar nicht oder aber ist schneller wieder zu und weg, als ich es sah :lol:

Im Terminalfenster erscheint nur der (gewöhnliche) Prompt.
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von herz4 » Sa 12. Feb 2022, 08:10

Noch immer funzt - bei mir - der bsync-Parameter des shell-Befehls nicht, Und endlich habe ich gogos Anregung umgesetzt, und mir Ersatz verschafft, der um ein unnötiges Warten per (ausgespieltem) Wait-Befehl herumkommt. Meine Lösung ist ein Tool, mit dem ich Bash/Systembefehle generell verbaue, mit Warten-Schalter, oder auch ohne:

Code: Alles auswählen

Function TERMINATOR (BEFEHLSFOLGE AS String, Optional WARTEN)
'20220212 

AN = "/tmp/LO_BASICSCRIPT_ARBEITET_" & Time

If Not IsMissing(WARTEN) Then
	BEFEHLSFOLGE = "touch " + AN + "; " + BEFEHLSFOLGE + "; rm -f " + AN
EndIf

shell("gnome-terminal", 1, "-- /bin/bash -c '" + BEFEHLSFOLGE + "'", True)

Do While FileExists(AN)
Wait 100
Loop

End Function
Mein tmp-Verzeichnis liegt auf einer RAM-Disk. Wait 100, also 0,1s scheint mir ein guter Kompromiss zwischen "unendlich" vielen Schleifendurchläufen mit kleinerer Zahl und dem Anspruch, "schnell" weiter gehen zu können.

Vielleicht kann der eine oder andere mein Script nutzen, ich freute mich besonders über Verbesserungsvorschläge. :roll:
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von gogo » Sa 12. Feb 2022, 14:21

ich sagte Dir doch, Du sollst die gesamte Codezeile des Makros posten...
Ein einzelner Befehl verhält sich exakt so wie Du das erwartest:

Code: Alles auswählen

sub TEST_BASICALLY
a = time
b= shell("konsole",1,"-e sleep 5", true)
print a , b , time
end sub
"BEFEHLSFOLGE" legt aber nahe, dass es verschiedene Befehle sind, und die werden in einem Terminalemulator parallel gestartet.

Code: Alles auswählen

sub TEST_RUBBISH
a = time
b= shell("konsole",1,"-e 'date & sleep 1 & date & sleep 1 & date & sleep 1 & date & sleep 1'", true)
print a , b , time
end sub
Das kannst Du am leichtesten vermeiden, wenn Du alle Befehlen in ein Script packst und dieses per -e an das Terminal übergibst. Dann wirst Du auch das gewünschte Ergebnis haben(kopiere myscript in Dein Home-Verzeichnis):

Code: Alles auswählen

sub TEST_SHELL
a = time
b= shell("konsole",1,"-e /home/$USER/myscript", true)
print a , b , time
end sub
Wenn Du das Script (myscript) dynamisch erstellen musst, ist zu bedenken, dass die shell-Funktion die Parameter IMMER bei Leerzeichen trennt, und bash die Parameter nochmals per IFS trennt...
Falls Du also (was in der Regel notwendig ist) Leerzeichen innerhalb einer Befehlszeile hast, musst Du diese kaschieren und danach im Script (write_bash) wieder auflösen:

Code: Alles auswählen

sub TEST_SHELL_SCRIPT
dummy = shell("/home/$USER/write_bash",1,"date#&&#sleep#1#&&#date#&&#sleep#1#&&#date#&&#sleep#1#&&#date#&&#sleep#1 echo#FERTIG sleep#5")
a = time
' consider using '--hold'!
b = shell("konsole",1,"-e /tmp/myscript", true)
print a , b , time
end sub
(Alternativ geht's auch mit Open "/tmp/myscript" ... write xyz ... da musst Du aber zum Schluss die " aus jeder Zeile am Anfang und am Ende entfernen ... per sed am einfachsten)
Dateianhänge
write_bash.zip
(306 Bytes) 80-mal heruntergeladen
myscript.zip
(171 Bytes) 81-mal heruntergeladen
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von herz4 » Sa 12. Feb 2022, 16:38

Hallo gogo,
ich danke Dir für Dein Verständnis und Deine prompte Antwort.
ich sagte Dir doch, Du sollst die gesamte Codezeile des Makros posten...
Welches der vielen hättest Du denn gern? Bsp.: echo hello; sleep 2; echo hello2; sleep 2
Ein einzelner Befehl verhält sich exakt so wie Du das erwartest:
Nein, leider nicht. Egal ob ein "einfacher" Bash-Befehl oder eine Folge wie im obigen Beispiel, der bSync-Parameter hat auf meinem System - keine - Auswirkung!
Die Anwendung "konsole" habe ich extra bei mir installiert. Trotzdem wird bei Deinem "TEST_BASICALLY" zweimal der exakt gleiche Zeitpunkt(!) getrennt von Leerzeichen, 0, Leerzeichen ausgegeben.
"BEFEHLSFOLGE" legt aber nahe, dass es verschiedene Befehle sind, und die werden in einem Terminalemulator parallel gestartet.
Mit BEFEHLSFOLGE meine ich BEFEHL[; BEFEHL2][; BEFEHL3]... usw. Ein Befehl kann dabei auch das Aufrufen eines Bash-Scripts sein.
Einzig Dein vorgeschlagenes Kopieren der Befehlsfolge in eine ("dummy"-)myscript-Datei habe ich nicht noch gesondert probiert, weil ich - damit - nicht die Hoffnung verbinde, das bSync bei mir funzt.
ist zu bedenken, dass die shell-Funktion die Parameter IMMER bei Leerzeichen trennt, und bash die Parameter nochmals per IFS trennt...
Du siehst in meinem Code, dass ich die starke Quotierung(?) mit einfachen Anführungsstrichen gewählt habe. Bis jetzt funzt mein (Tool-)Makro ohne Beanstandungen. Demzufolge entfallen für mich auch etwaige Kaschierungen oder ähnlich ...

Nochmals danke ich, nichts für ungut!

P.S. Was macht "konsole" besser oder anders als "gnome-terminal", was bei meinem System wohl standardmäßig installiert wird? (Ich wollte sonst nämlich "konsole" wieder löschen ...)
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von gogo » Sa 12. Feb 2022, 21:41

konsole ist der Standard-Terminal-Emulator für xterm unter KDE - irgendwo liegt bei mir auch ein Gnome rum - wenn's passt probier ich's dort mal.
Statt konsole kannst Du auch xterm verwenden, mit dem Parameter -hold bleibt das Fenster immer offen bis es durch den WM beendet wird:
Screenshot_20220212_213825.png
Screenshot_20220212_213825.png (24.94 KiB) 2084 mal betrachtet
Screenshot_20220212_213853.png
Screenshot_20220212_213853.png (7.61 KiB) 2084 mal betrachtet
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von gogo » Sa 12. Feb 2022, 22:51

btw: kannst Du erläutern was

Code: Alles auswählen

-- /bin/bash 
bewirken soll?
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von herz4 » So 13. Feb 2022, 09:59

Abermals danke ich für Deine Antworten - und Frage, gogo.
Um Letztere überhaupt (annähernd) beantworten zu können, musste ich "Experimente" durchführen. So benutzte ich (erneut) alle möglichen Schalter und Schalterkombinationen von "gnome-terminal", um so eine Befehlsfolge meiner Bauart, eigentlich ein verkapptes Bash-Script ohne dieses selbst, dem Terminal zu übergeben. Und dabei stoße ich wahrscheinlich an die von Dir erklärten Grenzen, dass jedes Leerzeichen, sei es auch nur zur Trennung von Befehl und Parametern, die Folge abbrechen lässt. Somit kann ich nicht einmal einen Bashbefehl wie etwa "sleep 2" übergeben, immer "rotes" Terminal!
Und genau das lässt aber /bin/bash mit dem Schalter -c zu, wenn man die Folge - insgesamt - mit dem einfachen Anführungsstrich umschließt (wie Strings in Bash-Scripten). Also, was bei Dir das Bashscript-Dummy tut, tut für mich der Befehl bash. "-- /bin/bash" folgt der Syntax von gnome-terminal.
In meiner eigenen Erklärung hier ist unlogisch, dass "--" selbst vom Leerzeichen gefolgt ist, auch zwischen "/bin/bash" und "-c" ist ein solches, noch eins danach. Spätestens hier endet mein "Latein".
Deine Nachfrage, gogo, ließ mich gleich noch meinem "Terminator"-Tool ein "Bashinator" hinzugesellen, denn oft sind gar keine Ein- und Ausgaben, Passwörter etc. in den Befehlsfolgen nötig. Reicht, wenn es im Hintergrund abgearbeitet wird. Einziger Unterschied zwischen beiden Tools ist dann nur die shell-Zeile:

Code: Alles auswählen

shell("bash", 1, " -c '" + BEFEHLSFOLGE + "'", true)
In aller Bescheidenheit: Das englischsprachige LO-Forum macht mich glauben, dass ich kein Exot bin mit dem bSync-Problem, weshalb das "true" hier oberhalb - bei mir - rein akademisch ist :!:
(Nach meiner Erinnerung tritt es nicht in Windoof-Systemen auf, in welchen Linuxen nicht, weiß ich nicht.)
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von gogo » So 13. Feb 2022, 11:04

versuch' einfach mal xterm (sollte vorinstalliert sein) mit dem -hold Parameter. konsole, gnome-terminal, kitty, tilda, yakuake und so wie sie alle heißen sind alles aufgemotze Versionen.

Der Grund, warum ich das Thema weiter verfolge ist, dass wild gewordene shell-Befehle zu ziemlich großen Problemen führen können. Du solltest jeden Bash-Befehl und insbesondere skripte in seiner Ausführung kontrollieren, sonst laufen die stderr nach /dev/null und dafür sind Fehlermeldungen nicht gemacht.

Die shell()-Funktion ruft EIN Programm (Parameter 1) auf und übergibt ALLE unter Parameter 3 gelisteten Optionen. Terminals und /bin/bash sind Prozessstarter innerhalb der shell()-Funktion. Sie verarbeiten ALLES, was man ihnen hinter -e/-c an Parametern übergibt, aber Dein Einfluss darauf ist "begrenzt", weil shell() davon gar nichts mitbekommt. Daher auch die vielen Probleme. Wenn da irgendetwas nicht ausführbares steht, dann kommt eine interne Fehlermeldung für Prozess xyz und das Terminal macht mit dem nächsten weiter. Die shell()-Funktion bietet daher KEINE Terminalfunktion, sondern "... ruft EIN Programm (Parameter 1) auf und übergibt ALLE unter Parameter 3 gelisteten Optionen."
usw.

Daher: Alles, was KEIN Einzelbefehl ist, MUSS, damit es richtig abläuft, über ein externes Script ausgeführt werden (welches eine Befehlskette zu einem Einzelbefehl vereinigt). Mehrere Bash-Befehle in einer shell()-Funktion abzuarbeiten kann klarerweise funktionieren, aber dafür ist sie nicht programmiert, daher sind bei Befehlsketten bSync-Probleme zwar Probleme, aber hausgemachte und kein Bug ;)
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Re: Shell()-Befehl unter Linux und bsync-Parameter

Beitrag von herz4 » So 13. Feb 2022, 19:31

Ganz großen Dank, Dir gogo, für Deine Ausdauer mit mir Langsammerker :oops:
Also, ich habe (nach meiner Erinnerung) den bSync-Parameter der shell()-Funktion erstmalig - nützlich - eingesetzt. Und zwar mit ganz elementaren Bash-Befehlen, wie z.B. sleep (Bsp. shell("sleep", 1, "3", true) lieferte mir dann tatsächlich die 3s Zeitdifferenz. Und vor allem das print-Fenster erst, als das Terminalfenster schloss. Das funzt auch mit shell("bash",1,"-c /tmp/myscript.sh", true). Soweit so gut!
Aber, mit ssh- und sshfs-Befehlen und dann notwendigerweise mehreren Parametern versagt shell - gänzlich. Der Befehl wird nicht mehr (ordentlich), mutmaßlich gar nicht ausgeführt. Da half weder shell("ssh", 1, "Parameter ...", true) direkt, noch shell("bash",1,"-c ssh Parameter ... ", true). Nada, niente. Es kommt noch besser!
shell("gnome-terminal",1,"sleep 3", true) lief zwar tadellos, stoppte aber nicht, keine Zeitdifferenz! Gleiches bei Bashscript.
shell("konsole",1,"sleep 3", true) lief tadellos, stoppte und lieferte die korrekte Zeitdifferenz, auch mit Bashscript.
Mithin habe ich jetzt den Vorteil von "konsole" selbst erfahren! ("xterm" ist hier auch nicht standardmäßig inst.) Aber auch "konsole" kommt nicht mit mehreren Parametern bei ssh oder sshfs klar.
Danke, gogo, ich bin ein gehöriges Stück weiter gekommen - gedanklich. :P
(Ich markier mal als gelöst.)
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten