IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

bash et menu.xml


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 24
    Points
    24
    Par défaut bash et menu.xml
    Bonsoir, je suis en train de créer une série de scripts pour l'installation de logiciel depuis les dépôt aur, j'ai pour système arch linux avec openbox.
    Question : je souhaiterai après installation d'un logiciel (vscode dans l'exemple qui suit) crée une entré dans le menu.xml directement dans la catégories <menu id="root-menu-101141" label="Developpement"> Ligne 45 du menu.xml.

    Mon script me place l'entré a la fin du menu.xml.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #!/bin/bash
     
    yaourt -S code-git --noconfirm # pour installation de vscode
     
     
    # Pour l'intégration dans le menu.xml
     
    cat >> ~/.config/openbox/menu.xml << EOF 
           <item label="vscode">
    	   <action name="Execute">
    		<command>code</command>
    	   </action>
    	</item>
    EOF
     
    openbox --reconfigure
    Voici mon menu.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
     
    <?xml version="1.0" encoding="utf-8"?>
    <openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/file:///usr/share/openbox/menu.xsd">
    	<menu id="root-menu" label="Openbox 3">
    		<menu id="accessories" label="Accessories">
    			<item label="File-Roller">
    				<action name="Execute">
    					<command>
    						file-roller
    					</command>
    				</action>
    			</item>
    			<item label="Task Manager (htop)">
    				<action name="Execute">
    					<command>gksu htop</command>
    				</action>
    			</item>
    			<item label="Terminal (root)">
    				<action name="Execute">
    					<command>
    						gksu terminology
    					</command>
    				</action>
    			</item>
    			<item label="File Manager (root)">
    				<action name="Execute">
    					<command>
    						gksu nautilus
    					</command>
    				</action>
    			</item>
    			<item label="Terminal">
    				<action name="Execute">
    					<execute>terminology</execute>
    				</action>
    			</item>
     
    		</menu>
    		<menu id="root-menu-101141" label="Developpement">
    			<item label="Atom">
    				<action name="Execute">
    					<command>atom</command>
    				</action>
    			</item>
                            #  Entrée à placé Ici
    		</menu>
    		<menu id="graphics" label="Graphics">
    			<item label="GIMP">
    				<action name="Execute">
    					<command>
    						gimp
    					</command>
    				</action>
    			</item>
    			<item label="Viewnior Image Viewer">
    				<action name="Execute">
    					<command>
    						viewnior
    					</command>
    				</action>
    			</item>
    			<item label="Feh">
    				<action name="Execute">
    					<command>
    						feh
    					</command>
    				</action>
    			</item>
    			<item label="Imagemagick">
    				<action name="Execute">
    					<command>
    						imagemagick
    					</command>
    				</action>
    			</item>
    			<item label="Blender">
    				<action name="Execute">
    					<command>
    						blender
    					</command>
    				</action>
    			</item>
    		</menu>
    		<menu id="multimedia" label="Multimedia">
    			<item label="Mpv">
    				<action name="Execute">
    					<command>mpv</command>
    				</action>
    			</item>
    			<item label="Deadbeef">
    				<action name="Execute">
    					<command>
    						deadbeef
    					</command>
    				</action>
    			</item>
    			<item label="Volume Control">
    				<action name="Execute">
    					<command>
    						pavucontrol
    					</command>
    				</action>
    			</item>
    			<item label="Totem">
    				<action name="Execute">
    					<command>totem</command>
    				</action>
    			</item>
    		</menu>
    		<menu id="network" label="Network">
    			<item label="firefox">
    				<action name="Execute">
    					<command>
    						firefox
    					</command>
    				</action>
    			</item>
    			<item label="Messagerie">
    				<action name="Execute">
    					<command>
    						thunderbird
    					</command>
    				</action>
    			</item>
    		</menu>
    		<menu id="office" label="Office">
    			<item label="libreoffice">
    				<action name="Execute">
    					<command>libreoffice</command>
    				</action>
    			</item>
    			<item label="Evince">
    				<action name="Execute">
    					<command>
    						evince
    					</command>
    				</action>
    			</item>
    		</menu>
    		<separator/>
    		<menu id="settings" label="Settings">
    			<menu id="conkyconfig" label="Conky">
    				<item label="Edit .conkyrc">
    					<action name="Execute">
    						<command>
    							gvim ~/.conkyrc
    						</command>
    					</action>
    				</item>
    			</menu>
    			<menu id="gmrunconfig" label="gmrun">
    				<item label="Edit config file">
    					<action name="Execute">
    						<command>
    							gvim ~/.gmrunrc
    						</command>
    					</action>
    				</item>
    			</menu>
    			<menu id="obConfig" label="Openbox">
    				<item label="Edit menu.xml">
    					<action name="Execute">
    						<command>
    							gvim ~/.config/openbox/menu.xml
    						</command>
    					</action>
    				</item>
    				<item label="Edit rc.xml">
    					<action name="Execute">
    						<command>
    							gvim ~/.config/openbox/rc.xml
    						</command>
    					</action>
    				</item>
    				<item label="Edit autostart">
    					<action name="Execute">
    						<command>
    							gvim ~/.config/openbox/autostart
    						</command>
    					</action>
    				</item>
    				<separator/>
    				<item label="Obmenu">
    					<action name="Execute">
    						<command>
    							obmenu
    						</command>
    					</action>
    				</item>
    				<item label="Obconf">
    					<action name="Execute">
    						<command>
    							obconf
    						</command>
    					</action>
    				</item>
    				<separator/>
    				<item label="Reconfigure">
    					<action name="Reconfigure"/>
    				</item>
    				<item label="Restart">
    					<action name="Restart"/>
    				</item>
    			</menu>
    			<menu id="tint2config" label="tint2">
    				<item label="Edit config file">
    					<action name="Execute">
    						<command>
    							gvim ~/.config/tint2/tint2rc
    						</command>
    					</action>
    				</item>
    				<item label="tint2config">
    					<action name="Execute">
    						<command>
    							tint2conf
    						</command>
    					</action>
    				</item>
    			</menu>
    			<menu id="DisplaySettings" label="Display Settings">
    				<item label="Resolution">
    					<action name="Execute">
    						<command>
    						    arandr
    					    </command>
    					</action>
    				</item>
    			</menu>
    			<item label="Lxappearance">
    				<action name="Execute">
    					<command>
    						lxappearance
    					</command>
    				</action>
    			</item>
    		</menu>
    		<menu id="system" label="System">
    			<item label="GParted">
    				<action name="Execute">
    					<command>
    						gksudo gparted
    					</command>
    				</action>
    			</item>
    			<menu id="script" label="Script Installation">
    				<item label="Yaourt">
    					<action name="Execute">
    						<execute>terminology -e sh ~/bin/yaourt.sh</execute>
    					</action>
    				</item>
    				<item label="Sublime Text">
    					<action name="Execute">
    						<execute>terminology -e sudo sh ~/bin/sublimtext.sh</execute>
    					</action>
    				</item>
    				<item label="VS Code">
    					<action name="Execute">
    						<execute>terminology -e sh ~/bin/vscode.sh</execute>
    					</action>
    				</item>
    			</menu>
    		</menu>
    		<separator/>
    		<item label="Reboot">
    			<action name="Execute">
    				<execute>terminology -e sudo 'shutdown -r now'</execute>
    			</action>
    		</item>
    		<item label="Arret">
    			<action name="Execute">
    				<execute>terminology -e sudo 'shutdown -h now'</execute>
    			</action>
    		</item>
    		<separator/>
    	</menu>
    </openbox_menu>

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 309
    Points : 12 815
    Points
    12 815
    Par défaut
    Bonjour,

    Pour le fun, une solution sed...

    Ici, le fichier à rajouter se nomme /tmp/item.sup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e '/<menu id.*label="Developpement">/,/<\/menu>/{/<\/menu>/{x;s@\(.*\)@cat /tmp/item.sup@e;G};}' /tmp/menu.xml
    Après, il faut rajouter l'option -i pour que le fichier /tmp/menu.xml de l'exemple soit modifié.

    Après, le mieux serait d'utiliser des outils plus adaptés au xml.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    Bonjour,

    sans fichier temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ sed '/menu id="root-menu-101141/{:a;/<\/menu>/! {n;ba;};i\
          <item label="vscode">\
             <action name="Execute">\
                <command>code</command>\
             </action>\
          </item>
    }' $chemin/menu/xml

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 309
    Points : 12 815
    Points
    12 815
    Par défaut
    Oui, je ne passe par le fichier temporaire que pour ne pas à avoir à gérer les cas spéciaux comme par exemple une insertion de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <command>code '-e fichier'</command>
    Je sais c'est tordu, mais via le fichier, on a strictement ce qu'il y a dedans, pas besoin de se faire un nœud au cerveau

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Merci de vos réponses, je n'avais pas pensé a sed... je tiens à précisé que je suis débutant dans le bash.

    Par contre je saisi pas bien cette portion de code : de Mr N_BaH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {:a;/<\/menu>/! {n;ba;};i\
    Vous pourriez m'expliquer...

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 474
    Points
    19 474
    Par défaut
    c'est une boucle : bmarque (ici a) renvoie à :marque, tant que </menu> n'est pas rencontré.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {:a;/<\/menu>/! {n;ba;};i\
    ça, c'était avant, maintenant c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {:a;/<\/menu>/! {N_BaH};i\
    Bon je sors

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    merci je vais tester ...

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 896
    Points : 6 655
    Points
    6 655
    Par défaut
    Une approche utilisant xslt via xsltproc (xslt 1.0):

    Une feuille de style qui va copier ton document xml (avec le template identity) et insérer ton nouvel item avec un autre template à l'emplacement voulu désigné par un chemin xpath.

    Code menu.xsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                                  xmlns="http://openbox.org/">
     
        <xsl:output indent="yes" encoding="utf-8" omit-xml-declaration="no"/>
        <xsl:strip-space elements="*"/>
     
        <xsl:template match="node()|@*" name="identity">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
     
        <xsl:template match="text()">
            <xsl:value-of select="normalize-space(.)" />
        </xsl:template>
     
        <xsl:template match="*[@id='root-menu-101141']/*[position()=last()]">
            <xsl:call-template name="identity"/>
            <xsl:copy-of select="document('item.xml', .)"/>
        </xsl:template>
     
    </xsl:stylesheet>

    La feuille de style fait référence à un fichier item.xml qui contient ton nouvel item. Il faut donc le créer en prenant garde d'ajouter à la racine le même espace de noms que celui utilisé dans ton fichier menu.xml, soit http://openbox.org/:
    Code item.xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8"?>
    <item label="vscode" xmlns="http://openbox.org/">
        <action name="Execute">
            <command>code</command>
        </action>
    </item>

    Puis dans ton script bash tu ajoutes: xsltproc menu.xsl menu.xml pour afficher le résultat ou bien xsltproc -o menu.xml menu.xsl menu.xml pour écraser menu.xml avec la nouvelle version.

    Le principal avantage est l'absence de mauvaises surprises par rapport à une approche purement textuelle, dans la mesure où xsltproc a parsé menu.xml pour identifier tous les éléments et déterminer son architecture sur laquelle va s'appuyer la feuille de style.

    À titre d'exemple, voici quelques pièges dans lesquels un parser xml ne tombera pas, contrairement à une approche purement textuelle:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <!-- le tag fermant "menu" est sur la même ligne que le tag fermant "item" -->
    <menu id="root-menu-101141" label="Developpement">
        <item label="Atom">
            <action name="Execute">
                <command>atom</command>
            </action>
        </item></menu>
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- le menu ciblé contient des sous-menus -->
    <menu id="root-menu-101141" label="Developpement">
        <item label="Atom">
            <action name="Execute">
                <command>atom</command>
            </action>
        </item>
        <menu label="Database">
            <item label="MySQL Workbench">
                <action name="Execute">
                    <command>mysql-workbench</command>
                </action>
            </item>
        </menu>
    </menu>
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!-- Un commentaire qui traîne contient le tag fermant "menu"-->
    <menu id="root-menu-101141" label="Developpement">
        <item label="Atom">
            <action name="Execute">
                <command>atom</command>
            </action>
        </item>
       <!-- </menu> -->
        <item label="MySQL Workbench">
            <action name="Execute">
                <command>mysql-workbench</command>
            </action>
        </item>
    </menu>

    Une autre solution possible est d'utiliser un langage de script comme perl ou python qui dispose de modules pour éditer du xml. Dans ce cas, tu peux même envisager tout ton script dans un de ces langages.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    CosmoKnacki super je te remercie J'ai un peu adapté ta solution a mes besoins, ce qui donne :
    Un de ces quatre je regarderai du coté de python... merci a vous tous...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #!/bin/bash
     
    # Couleurs Bash
     
    #    30m : noir
    #    31m : rouge
    #    32m : vert
    #    33m : jaune
    #    34m : bleu
    #    35m : rose
    #    36m : cyan
    #    37m : gris
     
    #================= Test connection
    ping -c 4 google.com
    test=$?
     
    if [ "$test" -eq 0 ]; then
        echo -e "\e[33m[-- Network connecter, suite du programme...]";
    else
    	echo -e "\e[31m[-- S'il vous plait connecter Network...]";
    	sleep 3s && exit 0
    fi
    yaourt -S visual-studio-code-bin --noconfirm
    package=$?
     
    if [ "$package" -eq 0 ]; then
    echo -e  "\e[33m===========[Test ok ...]=====";
     
    cat > ~/.config/openbox/item.xml <<EOF
    <?xml version="1.0" encoding="utf-8"?>
    <item label="vscode" xmlns="http://openbox.org/">
        <action name="Execute">
            <command>code</command>
        </action>
    </item>
    EOF
     
    cat > ~/.config/openbox/menu.xsl <<EOF
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                                  xmlns="http://openbox.org/">
     
        <xsl:output indent="yes" encoding="utf-8" omit-xml-declaration="no"/>
        <xsl:strip-space elements="*"/>
     
        <xsl:template match="node()|@*" name="identity">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
     
        <xsl:template match="text()">
            <xsl:value-of select="normalize-space(.)" />
        </xsl:template>
     
        <xsl:template match="*[@id='root-menu-101141']/*[position()=last()]">
            <xsl:call-template name="identity"/>
            <xsl:copy-of select="document('item.xml', .)"/>
        </xsl:template>
     
    </xsl:stylesheet> 
    EOF
     
    xsltproc -o ~/.config/openbox/menu.xml ~/.config/openbox/menu.xsl ~/.config/openbox/menu.xml 
    openbox --reconfigure
     
    rm -f ~/.config/openbox/menu.xsl && rm -f ~/.config/openbox/item.xml 
     
    else
        echo -e  "\e[33m===========[Installation Echoué ...]=====";
     
    fi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Le menu XML ne fonctionne pas
    Par Buffalo1214 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/06/2012, 10h36
  2. Problème lien menu XML/AS3
    Par moman67 dans le forum Flash/Flex
    Réponses: 1
    Dernier message: 28/04/2011, 11h19
  3. Problème lien menu XML/AS3
    Par moman67 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 28/04/2011, 11h17
  4. lancer des videos depuis un menu xml
    Par charlie koller dans le forum ActionScript 1 & ActionScript 2
    Réponses: 3
    Dernier message: 18/01/2008, 12h58
  5. menu XML avec images
    Par yisahn dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/09/2007, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo