[Résolu][Basic] Appel à exécution d'un script Bash

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Denis4085
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 03 janv. 2025 04:06

[Résolu][Basic] Appel à exécution d'un script Bash

Message par Denis4085 »


La modération vous a écrit: règles de cette section
Le balisage (à taper au clavier) doit être correctement orthographié (première lettre en majuscule puis le reste en minuscules).
+ rajout de [Basic] supprimé par [Résolu]

Bonjour,
sujet inspiré du sujet imparfaitement résolu ou au titre inadéquat ou ambiguë: [Résolu][Bash]Appel de script dans "Mes Macros"

Ce code correspond bien à un titre du genre "Modification d'un fichier texte (du système de fichier) depuis une macro"

Code : Tout sélectionner

Sub bavard(c As String, n As Integer)
Dim f As Integer
f = FreeFile
open "/home/trucmuche/Documents/essaiMacro.txt" for Output As f
Write #f, Time & " bavard a dit : " & n & " " & c
close #f
msgbox "bavard a terminé"
end sub
Mais où est le script bash exécuté ?

Ce code correspond bien à "Lancer une macro depuis un script bash" (appelons-le essai-macro-bavard.sh) :

Code : Tout sélectionner

#!/bin/bash
export DISPLAY=":0.0" # pas utile chez moi, d'ailleurs DISPLAY="0:"
cmdMacro="macro:///Standard.Module1.bavard(un,15)"
/opt/libreoffice5.3/program/soffice --headless "$cmdMacro"
exit 0
Disons plutôt soffice --headless "$cmdMacro" . Parfait.

Mais Quid de l'appel de essai-macro-bavard.sh depuis une macro (appelons-la call_my_script) ?
Je cherche du côté de session.RunApplication mais je ne parviens pas à faire fonctionner cet appel de méthode sur l'objet session.

Code : Tout sélectionner

Sub call_my_script
    Dim str As String
    GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
    Dim session As Variant
    session = CreateScriptService("Session")
  
	str = "contenu texte d'une plage de données"
	' essai-macro-bavard.sh n'étant pas une application nommée du système mais un simple fichier exécutable, ...
	session.RunApplication("/bin/bash /home/denis/Documents/Budget/essai-macro-bavard.sh", #str) ' GNU/Linux
	' ci-dessous aurait encore moins de sens, bash n'étant pas non plus une application
	session.RunApplication("/bin/bash", "/home/denis/Documents/Budget/essai-macro-bavard.sh" & #str) ' GNU/Linux
	' intéressant ci-dessous, il appelle l'application default de mon système pour traiter ce genre de fichier : 
	session.RunApplication("/home/denis/Documents/Budget/essai-macro-bavard.sh", #str)
	' ci-dessous ne marche pas, même si je déplace les arguments de konsole dans deuxième paramètre : "-e ./essai-macro-bavard.sh" & #str
	session.RunApplication("konsole -e ./essai-macro-bavard.sh", #str)
End Sub
dans mon exemple essai-macro-bavard.sh contient un simple

Code : Tout sélectionner

!#/bin/bah
echo "ce qu'on veut" >> essaiMacro.txt
juste pour tester .

le troisième appel a RunApplication est encourageant, il m'ouvre l'appli par défaut pour traiter les fichiers texte (sans configuration système pour traiter les .sh). Qu'est ce que je ne comprends pas et comment faire que je puisse réellement appeler mon script .sh (bash) depuis la macro call_my_script ?

NB: ce que j'envisage de faire c'est
  • appeler la macro "bavard" pour écrire des lignes dans un fichier texte "essaiMacro.txt"
  • lancer macro "call_my_script" depuis macro "bavard"
  • bash interprète ce script et traite les lignes dans "essaiMacro.txt
  • call_my_script finit en appelant une macro ou une fonction qui copie le contenu de "essaiMacro.txt dans une plage de donnée de la feuille
Dernière modification par Denis4085 le 13 janv. 2025 10:40, modifié 4 fois.
LibreOffice 7.4.7.2 sous Linux Debian 12.8
JPL
Membre lOOyal
Membre lOOyal
Messages : 38
Inscription : 17 mars 2012 10:16

Re: [BASIC][BASH] Appel à exécution d'un script linux depuis une macro

Message par JPL »

Bonjour,

le code suivant fonctionne très bien:

Code : Tout sélectionner

Sub call_my_script
    Dim str1 As String
    GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
    Dim session As Variant
    session = CreateScriptService("Session")
  
	str1 = "ici plusieurs mots"
	' essai-macro-bavard.sh n'étant pas une application nommée du système mais un simple fichier exécutable, ...
	file = "/home/.../essai-macro-bavard.sh"
	session.RunApplication("/bin/bash", file & " '" & str1 & "'")
End Sub
avec le shell:

Code : Tout sélectionner

!#/bin/bash
echo "ce qu'on veut $1" >> essaiMacro.txt 
L'espace entre le fichier et le texte qui suit est évidemment indispensable. Les apostrophes également s'il y a plusieurs mots à inérer.

JPL
Kubuntu 22.04 / LibO 25.2
Access2Base (LibO).
BaseDocumenter extension (LibO)
ScriptForge (LibO) - Documentation on https://help.libreoffice.org/latest/en- ... bPAR=BASIC
Denis4085
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 03 janv. 2025 04:06

Re: [Basic][Bash] Appel à exécution d'un script linux depuis une macro

Message par Denis4085 »

Un grand merci JPL, ça fleure bon le "that's it !" - Je teste ça tout à l'heure mais nul doute permis. :super: :D
PS: comme quoi la doc (la française n'étant qu'une traduction de l'anglaise) c'est des tonnes de trucs mais jamais l'info qu'il faut au bon endroit lorsqu'il s'agit de faire bonne pioche.


[Édit:] oupssss ça ne marche pas chez moi, bizarre. Il manquait la déclaration de la variable file (j'ai testé As Variant et As String mais rien n'y fait) :cry:
LibreOffice 7.4.7.2 sous Linux Debian 12.8
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25964
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Basic][Bash] Appel à exécution d'un script linux depuis une macro

Message par Dude »

Salut,
Denis4085 a écrit : 12 janv. 2025 16:45 oupssss ça ne marche pas chez moi, bizarre.
La phrase qui n'aide pas.
Un script du système s'exécute avec l'instruction Shell.
A condition bien sûr d'avoir les droits d'exécution pour le processus soffice.
Denis4085 a écrit : 12 janv. 2025 08:30 bash interprète ce script et traite les lignes dans "essaiMacro.txt
Pourquoi utiliser un script externe puisque tu conçois ton fichier avec Basic ? :shock:
Encore un problème XY

NB : [Bash] est inutile dans le titre et porte à confusion puisque tu ne lances pas Calc en ligne de commande.
Denis4085
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 03 janv. 2025 04:06

Re: [Basic]Appel à exécution d'un script Bash depuis une macro

Message par Denis4085 »

Bonjour, et merci de te pencher sur mon souci,
Dude a écrit : 13 janv. 2025 09:23 La phrase qui n'aide pas.
Un script du système s'exécute avec l'instruction Shell.
Tu confirmes donc qu'il faut passer l'instruction "Shell" (sensible à la casse ?) à la méthode RunApplication(commande, args)
cependant

Code : Tout sélectionner

GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
Dim session As Variant
Dim str1 As String
session = CreateScriptService("Session")
str1 = "ici plusieurs mots"
session.RunApplication("Shell", "/usr/local/bin/essai-macro-bavard.sh '" & #str1 & "'")
[/quote]
ni "/usr/local/bin/essai-macro-bavard.sh ..." ni "essai-macro-bavard.sh" ne fonctionnent.
Dude a écrit : 13 janv. 2025 09:23A condition bien sûr d'avoir les droits d'exécution pour le processus soffice.
ça n'est pas le problème posé, il n'y a aucun souci à lancer une macro basic depuis un script bash en utilisant la commande soffice, Bash n'est pas une prise de tête, il est simple, très puissant, et efficace et c'est pour ça qu'on l'aime.
Dude a écrit : 13 janv. 2025 09:23 Pourquoi utiliser un script externe puisque tu conçois ton fichier avec Basic ? :shock:
Parce que bash est puissant, efficace, et simple, c'est pour ça que je souhaite l'utiliser et apparemment ça n'est pas impossible, reste à trouver quelle syntaxe compliquée, fastidieuse, et prise de tête la basic attend de ma part. Comme je l'ai mentionné ailleurs, il me faudrait des mois à réapprendre le B-A-BA du Basic et des heures ignobles à mettre au point macros et/ou formules pour faire ce que je sais pouvoir faire en bash et en quelques minutes de mise en œuvre (je parle du traitement des données en soi), parce que bash est simple, très ... bref.
Dude a écrit : 13 janv. 2025 09:23Encore un problème XY
C'est une belle théorie ...
Dude a écrit : 13 janv. 2025 09:23NB : [Bash] est inutile dans le titre et porte à confusion puisque tu ne lances pas Calc en ligne de commande.
Tu m'apprends quelque chose. Je vais en tenir compte.
LibreOffice 7.4.7.2 sous Linux Debian 12.8
JPL
Membre lOOyal
Membre lOOyal
Messages : 38
Inscription : 17 mars 2012 10:16

Re: [Basic][Bash] Appel à exécution d'un script linux depuis une macro

Message par JPL »

Un script du système s'exécute avec l'instruction Shell.
En effet, la méthods

Code : Tout sélectionner

RunApplication()
tente successivement
(1) le Basic Shell()
(2) le service UNO com.sun.star.system.SystemShellExecute, en cas d'échec de (1).

Ces options sont complémentaires en ce sens que (2) ajoute le lancement autimatique à partir d'un fichier de l'application qui va bien, p. ex. lancement de l'éditeur pour un fichier texte donné en argument.

Autres remarques:
- suite au signalement https://bugs.documentfoundation.org/sho ... ?id=160222 une correction a été introduite sur la fonction RunApplication() à partir de LibreOffice 24.2. Personnellement j'ai testé le script proposé plus haut en version LO 25.2.
Votre signature mentionnant une version nettement antérieure, peut-être y a-t-il lieu de procéder à un upgrade.
- la fonction RunApplication() lance la fonction externe en mode asynchrone, donc Basic n'attend pas la fin du script externe mais poursuit aussitôt après le lancement. Vérifier donc que ce choix est le bon.

JPL

PS: je constate à l'instant que nos réponses se croisent: Shell() est une instruction Basic, pas une application externe. Voir https://help.libreoffice.org/master/fr/ ... _id3150040
Kubuntu 22.04 / LibO 25.2
Access2Base (LibO).
BaseDocumenter extension (LibO)
ScriptForge (LibO) - Documentation on https://help.libreoffice.org/latest/en- ... bPAR=BASIC
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25964
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Basic]Appel à exécution d'un script Bash depuis une macro

Message par Dude »

Création d'un test.sh dans home :

Code : Tout sélectionner

#!/bin/bash
touch /tmp/test
Mise en exécution du script :

Code : Tout sélectionner

$ chmod +x ~/test.sh
Dans l'EDI Basic, j'exécute :

Code : Tout sélectionner

Sub Main
    Shell("~/test.sh")
End Sub
Ceci fonctionne et me crée bien un fichier /tmp/test
Testé sous OpenOffice 4.1.15 et Debian 12.9
Denis4085
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 03 janv. 2025 04:06

Re: [Basic]Appel à exécution d'un script Bash depuis une macro

Message par Denis4085 »

Ben voilà :wink:
Prodigieux de simplicité :aie:
Merci beaucoup Dude, tout simplement Shell() ...
LibreOffice 7.4.7.2 sous Linux Debian 12.8
Denis4085
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 03 janv. 2025 04:06

Re: [Basic][Bash] Appel à exécution d'un script linux depuis une macro

Message par Denis4085 »

JPL a écrit : 13 janv. 2025 10:13Autres remarques:
- suite au signalement https://bugs.documentfoundation.org/sho ... ?id=160222 une correction a été introduite sur la fonction RunApplication() à partir de LibreOffice 24.2. Personnellement j'ai testé le script proposé plus haut en version LO 25.2.
Votre signature mentionnant une version nettement antérieure, peut-être y a-t-il lieu de procéder à un upgrade.
- la fonction RunApplication() lance la fonction externe en mode asynchrone, donc Basic n'attend pas la fin du script externe mais poursuit aussitôt après le lancement....
JPL

PS: je constate à l'instant que nos réponses se croisent: Shell() est une instruction Basic, pas une application externe. Voir https://help.libreoffice.org/master/fr/ ... _id3150040
Merci beaucoup pour toutes ces remarques JPL, en effet, c'est l'explication.
JPL a écrit : 13 janv. 2025 10:13Vérifier donc que ce choix est le bon.
Quel choix vérifier ?

Merci beaucoup :P
LibreOffice 7.4.7.2 sous Linux Debian 12.8