[bash] une GUI pour nos scripts bash
Publié : 06 fév 2017, 13:28
Suite à une question sur un autre forum, j'ai réalisé qu'il est en fait très rare que l'on habille nos scripts bash pour qu'ils puissent être utilisés directement avec notre bureau.
Il existe une bibliothèque (paquet a installer) zenity pour GTK et une autre kdialog pour environnement QT
On a la possibilité de
- demander une entrée (boite avec champ de saisie texte, sélection de fichiers)
- afficher des notifications (boites de dialogue info,erreur ...)
- afficher un résultat
Il est très facile de reprendre un script existant pour le mettre à la sauce GUI
Pour l'exemple, le script va afficher à quel paquet appartient un fichier
La version console :
-------------------------------------------------------
Passons à notre GUI avec zenity (gtk)
Nous pouvons afficher une boite de sélection de fichier si aucun nom n'est rentré, un gros plus par rapport à la version console.
une erreur a un moment ?
et pour afficher le résultat, on va écrire du html dans un simple fichier texte
Voila nous avons tout pour réécrire notre script (fichier "
Maintenant il fonctionne bien mais en ligne de commande
Il nous faut donc créer un lanceur, fichier
Avec ce lanceur, nous avons un véritable programme Gtk
Pour l'utiliser (plus de console ), 3 façons de faire
et avec thunar (clic droit) :
Il existe une bibliothèque (paquet a installer) zenity pour GTK et une autre kdialog pour environnement QT
On a la possibilité de
- demander une entrée (boite avec champ de saisie texte, sélection de fichiers)
- afficher des notifications (boites de dialogue info,erreur ...)
- afficher un résultat
Il est très facile de reprendre un script existant pour le mettre à la sauce GUI
Pour l'exemple, le script va afficher à quel paquet appartient un fichier
La version console :
#!/usr/bin/bash
fichier="$1"
[ -f "$fichier" ] || { echo "entrez le nom d'un fichier"; exit 1; }
paquet=$(/usr/bin/pacman -Qoq "$fichier")
if [ -n "${paquet}" ]; then
echo "paquet: ${paquet}"
pacman -Qlq "${paquet}"
pacman -Qi "${paquet}"
else
echo "fichier non installé par pacman"
fi
Passons à notre GUI avec zenity (gtk)
Nous pouvons afficher une boite de sélection de fichier si aucun nom n'est rentré, un gros plus par rapport à la version console.
fichier=$(zenity --file-selection --title="Sélectionnez un fichier")
une erreur a un moment ?
zenity --error --text "Erreur Manjaro Système ;)"
et pour afficher le résultat, on va écrire du html dans un simple fichier texte
zenity --text-info --html --filename=monfichier.html
Voila nous avons tout pour réécrire notre script (fichier "
pacman-qo
" avec droits en exécution)#!/usr/bin/bash
# trouver le paquet auquel appartient le fichier
# dependance zenity : doc : https://help.gnome.org/users/zenity/stable/index.html.fr
# dependance kdialog si kde
# fichier passé en paramètres sauvé dans variable "fichier"
fichier="$1"
if [ -z "${fichier}" ]; then
# pas de paramètres, on charge un fichier
if [[ "$XDG_CURRENT_DESKTOP" == "KDE" ]]; then
fichier=$(kdialog --getopenfilename / '*.* |tous fichiers' 2>/dev/null) # version kde
else
fichier=$(zenity --file-selection --title="Sélectionnez un seul fichier") # version GTK+
fi
if (($? != 0)); then
zenity --error --text "Annulé"
exit 111
fi
fi
# commandes pacman dans un fichier temporaire au format html
paquet=$(/usr/bin/pacman -Qoq "$fichier")
if [ -n "${paquet}" ]; then
# resultat non vide
# on retourne tous les textes dans un fichier html temporaire
# la conversion (rapide) html est faite avec la commande sed
echo "Le fichier: <b>${fichier}</b>
appartient au paquet <big><b>${paquet}</b></big>
<hr>Contenu de ce paquet:<br>" > /tmp/pacman-qo
pacman -Qlq "${paquet}" | sed -e 's|usr/bin/\(.*\)|usr/bin/<b>\1</b>|g' | sed 's/$/<br>/g' >> /tmp/pacman-qo
echo '<hr>' >> /tmp/pacman-qo
pacman -Qi "${paquet}" | sed 's/$/<br>/g' >> /tmp/pacman-qo
# on affiche le résultat :)
zenity --text-info --html --filename=/tmp/pacman-qo --title="pacman -Qo" 2> /dev/null
else
# résultat est vide !
zenity --error --text "Fichier <b>${fichier}</b> non installé par pacman"
exit 1
fi
[ -f "/tmp/pacman-qo" ] && rm "/tmp/pacman-qo"
exit 0
Il nous faut donc créer un lanceur, fichier
pacman-qo.desktop
avec les bons paramètres dans la ligne Exec
#!/usr/bin/env xdg-open
[Desktop Entry]
Comment=bash unity
Exec=/home/monlogin/workspace/bash/zenity/pacman-qo
GenericName[fr_FR]=pacman -Qo
GenericName=pacman -Qo
Icon=autopackage-manager-gtk
Name[fr_FR]=pacman-Qo
Name=pacman-Qo
StartupNotify=true
Terminal=false
Type=Application
Pour l'utiliser (plus de console ), 3 façons de faire
- un double clic sur le lanceur (ou via menu applications si intégré) et une boite de sélection de fichier s'ouvre et va nous afficher en résultat toutes les infos sur le paquet lié
- un glisser/relacher d'un de nos fichier sur l'icone (du lanceur) et nous avons directement les infos pacman.
- il est possible de l'intégrer dans le clic droit de votre navigateur de fichier préféré.
et avec thunar (clic droit) :