Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 22-08-2022 02:59:19

totoZero7
Membre
Distrib. : Debian 11 bullseye
Noyau : 5.10.0-16-amd64
(G)UI : Mate 1.24.1
Inscription : 05-07-2020

script bash boite de dialogue Zenity

Bonjour,

Je patauge avec mon code (et la compréhension tout court de bash avec Zenity).
La plupart de la documentation est pour bash sur terminal mais pas avec l'interface graphique zenity. Je plane avec les deux (déjà que je n'ai aucune connaissance en algo et autre).
Avec la documentation trouvée sur Debian facile ou ailleurs, je n'ai rien compris, dans le sens où ça ne faisait pas éco à ma recherche.

Voici mon code

#!/bin/bash
# mis à jour le 22/08/2022 sous Debian 11 Bullseye Mate

echo -e "Salut c'est gratuit, c'est pour ça que je t'en parle";

# On déclare les variables
# -------------------------
dir=$(pwd);
var1=$(tail -n1 log/madate2);               # Retourne la dernière sauvegarde effectuée écrite dans le fichier log madate2
var2=$(date +"%a %d %B %Y - %Hh%M:%S" >> log/madate2)# Enregistre la date et l'heure actuelle dans le fichier madate2
var3=$(tail -n1 log/madate2);             # Affiche la dernière date ajoutée

echo $var3


# =============================
# Paragraphe Boite de dialogue;
# =============================
# Cela s'affiche dans la boite de dialogue
zenity --info --width=350 --text="Bonjour, ma position est:\n$dir";


if zenity --question --width=350 --text="La dernière sauvegarde remonte à :\n$var1\n\nVoulez-vous faire une nouvelle sauvegarde ?";
  then
    $var2 && zenity --info --width=350 --text="c'est bon!\nDernière sauvegarde correctement effectuée le:\n\n$var3";
  else
    zenity --info --filename=log/madate2;
    zenity --info --width=200 --text="PAS sauvegardé\n$var3";
  exit
fi
 



Question 1:
----------------
Dans monde code, la sauvegarde se fait si on choisit 'Non' à la question (Oui ou Non). Pourquoi ? (alors que je l'ai mis juste après 'then' donc oui ? dans le code)


Question 2:
----------------
Si je veux quitter le programme, en cliquant sur la croix de l'interace graphique, juste après la première fenêtre qui dit 'Bonjour, ma position est...'
Que dois-je mettre dans le code pour que cela fonctionne ?


Question 3:
----------------
Quand j'exécute un script via le terminal, j'ai une trace de cette action dans l'historique '.bash_history', mais quand j'exécute ce même script via un lanceur sur le bureau, je n'ai pas de trace dans l'historique bash_history.
- Est-ce qu'il y a une trace de cette action quelque part ET si oui, où est-ce ?
- De même, est-ce qu'il y a une trace qqpart quand j'exécute un simpe 'echo -e "Salut c'est gratuit, c'est pour ça que je t'en parle" (ligne 4 dans le code);' dans ce script qui ne figure pas dans la fentêtre zenity ?

Question 4:
----------------
Quand j'exécute un script via mon lanceur sur le bureau, script qui est logé dans /home/totoSuperGraveZero/DossierScript/Le_Script.sh
et que dans mon script, je mets un "pwd" pour connaitre ma position, il indique /home/toto !
- Pourquoi indique-il cette position ? il le base sur quoi ?


En option
--------------
Si vous avez une remarque ou modification à apporter à ma première approche de code, n'hésitez pas à me le retourner.
Merci les libres

Hors ligne

#2 22-08-2022 06:38:21

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : script bash boite de dialogue Zenity

Hello,

Vite fait ce matin wink

Question 1 : pas normal !
question 2 : juste après la ligne de ta boite :

if [ "$?" -eq 1 ]
then
    exit
fi


Question 3 : Non pas de trace, il faut rediriger les sorties des commandes pour en avoir wink
Idem, pour le reste de la question wink
Question 4 : sûrement parce que tu lances le script dans un terminal (via le lanceur) et que ce terminal se trouve dans /home/toto.
En option : les ; à la fin de chaque ligne sont inutiles wink
Une erreur : $var2 && zenity ....
Une autre : zenity --info + -- filename : filename ne peut pas être utilisé par ce genre de boite wink

On en reparle cet après midi wink


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#3 22-08-2022 15:26:55

totoZero7
Membre
Distrib. : Debian 11 bullseye
Noyau : 5.10.0-16-amd64
(G)UI : Mate 1.24.1
Inscription : 05-07-2020

Re : script bash boite de dialogue Zenity

Merci, j'ai modifié après ton retour.

Voici les nouveautés:
var2 s’enclenche tout seul (et donc enregistre la date dans le fichier log/madate2) dès que je lance le script (via le lanceur) alors même que je ne l'ai pas mis dans le code !
comment cela se fait ?

Autre question sur var2
Comment faire pour que j’enclenche var2 si je clique sur Oui à la question ?

J'ai modifié l'indentation pour y voir un peu plus clair mais j'ai été contraint d'utiliser des antislash.
Je n'ai pas compris l'antislash, savoir quand on le met ou pas. J'ai tatonné et et mis ça d'une manière à ce que le code fonctionne mais je ne suis pas certain de ce que j'ai fait.
L'antislash sert pour qui ?

il n'y aurait pas un tuto avec des exemples sur ce que j'essaye de faire ? (un début de code avec zenity)

#!/bin/bash
# mis à jour le 22/08/2022 sous Debian 11 Bullseye Mate


# ===============
# Début de script
# ===============
# On déclare les variables
# -------------------------
dir=$(pwd)
var1=$(tail -n1 log/madate2)              # Retourne la dernière sauvegarde effectuée écrite dans le fichier log madate2
var2=$(date +"%a %d %B %Y - %Hh%M:%S" >> log/madate2) # Enregistre la date et l'heure actuelle dans le fichier madate2
var3=$(tail -n1 log/madate2)              # Affiche la dernière date ajoutée


# =============================
# Paragraphe Boite de dialogue:
# =============================
zenity \
--info --width=350 \
--text="Bonjour, ma position est:\n$dir"
  if [ "$?" -eq 1 ]
  then
      exit
  fi

if zenity \
--question --width=350 \
--text="La dernière sauvegarde remonte à :\n$var1\n\nVoulez-vous faire une nouvelle sauvegarde ?"
then
# Comment faire pour que j’enclenche var2 ?
  zenity \
  --info --width=350 \
  --text="c'est bon!\nDernière sauvegarde correctement effectuée le:\n\n$var3"
else
  zenity \
  --info --width=200 \
  --text="PAS sauvegardé\n$var3"
  exit
fi

Hors ligne

#4 22-08-2022 18:16:03

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : script bash boite de dialogue Zenity

Hello,


Les "anti-slash" servent à ne pas prendre en compte le retour à la ligne.
C'est donc utile pour aérer le code et le rendre plus lisible.
Pour que ce soit effectif (que ça fonctionne en gros), il faut que l'anti-slash soit précédé d'un espace et suivi d'un retour à la ligne.

Chaque variable (dir, var1, var2 et var3) est affectée par le retour de la commande (substitution de commande).
Donc chaque commande est exécutée.
Si tu veux utiliser la variable var2 plusieurs fois dans le script, un moyen de faire serait :

var2=$(date +"%a %d %B %Y - %Hh%M:%S")


puis pour enregistrer cette donnée dans un fichier :

echo "$var2" >> fichier_donnée


Je note "alternative" dans le script suivant cette façon de faire wink

Je reprends ton script et te propose ceci :

#!/bin/bash
# mis à jour le 22/08/2022 sous Debian 11 Bullseye Xfce par Tawal


# ===============
# Début de script
# ===============
# On déclare les variables
# -------------------------
dir=$(pwd)
var1=$(tail -n1 log/madate2)              # Ici comme en dessous, utilise les chemins absolus du fichier visé
# alternative
# var2=$(date +"%a %d %B %Y - %Hh%M:%S")
var3=$(tail -n1 log/madate2)              # idem


# =============================
# Paragraphe Boite de dialogue:
# =============================
if ! zenity --info --width=350 --text="Bonjour, ma position est:\n$dir"
then
    exit 1
fi

if zenity --question --width=350 --text="La dernière sauvegarde remonte à :\n$var1\n\nVoulez-vous faire une nouvelle sauvegarde ?"
then
# Comment faire pour que j’enclenche var2 ?
# comme ceci :
    date +"%a %d %B %Y - %Hh%M:%S" >> log/madate2         # Utilise aussi le chemin absolu du fichier "madate2"
# alternative
# echo "$var2" >> log/madate2
    zenity  --info --width=350  --text="c'est bon!\nDernière sauvegarde correctement effectuée le:\n\n$var3"
else
    zenity  --info --width=200  --text="PAS sauvegardé\n$var3"
# pas besoin d'un exit ici, car après le else, le code est fini.
# Donc si tu passes par cette étape, le script s'arrête quand même.
# À moins que tu veuilles avoir un code retour différent de zéro, alors utilise "exit 1" par exemple.
fi



Edit:
Quelques liens pour apprendre le bash :
https://abs.traduc.org/abs-fr/
https://frederic-lang.developpez.com/tu … rog-shell/
https://ineumann.developpez.com/tutorie … pratiques/

Edit:
Même script proposé mais avec des anit-slash pour aérer le code et en utilisant que "l'alternative" :

#!/bin/bash
# mis à jour le 22/08/2022 sous Debian 11 Bullseye Xfce par Tawal


# ===============
# Début de script
# ===============
# On déclare les variables
# -------------------------
dir=$(pwd)
var1=$(tail -n1 log/madate2)
var2=$(date +"%a %d %B %Y - %Hh%M:%S")
var3=$(tail -n1 log/madate2)


# =============================
# Paragraphe Boite de dialogue:
# =============================
if ! zenity --info \
            --width=350 \
            --text="Bonjour, ma position est:\n$dir"
then
    exit 1
fi

if zenity --question \
          --width=350 \
          --text="La dernière sauvegarde remonte à :\n$var1\n\nVoulez-vous faire une nouvelle sauvegarde ?"
then
    echo "$var2" >> log/madate2
    zenity --info \
           --width=350 \
           --text="c'est bon!\nDernière sauvegarde correctement effectuée le:\n\n$var3"
else
    zenity --info \
           --width=200 \
           --text="PAS sauvegardé\n$var3"
fi

Dernière modification par Tawal (22-08-2022 18:30:21)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#5 22-08-2022 22:32:09

totoZero7
Membre
Distrib. : Debian 11 bullseye
Noyau : 5.10.0-16-amd64
(G)UI : Mate 1.24.1
Inscription : 05-07-2020

Re : script bash boite de dialogue Zenity

Humm j'ai de la lecture dit donc !
Je vais regarde tout ça. Mais là, je triche encore peu car j'ai encore quelques questions.

Déjà un grand merci, car je planais grave.
Je garde ton alternative de variable et ton premier script, sans les antislashs, comme modèle car c'est un enfer d'écrire avec ces antislashs !


Voici mes questions big_smile
1. Que veut dire le point d'exclamation dans "if ! zenity"

2. Pourquoi mettre "exit 1" au lieu de "exit 0" ?. De ce que j'ai lu, ça dit que 0 termine proprement le script alors que 1 ou + indique une erreur.

3. Problème dans les 2 scripts avec var3
var3 ne donne pas la dernière ligne écrite (-n1) mais l'avant dernière (-n2). J'avais eu le même problème avec var1, j'ai donc créé var3, pensant que l'ancien résultat restait dans le cache un peut trop longtemps... mais ça fait exactement pareil avec var3.
Du coup, comment ça se fait que cela se produise ainsi (même avec un chemin absolu) ? et comment faire en sorte que je puisse lire (avec var1 ou var3) la nouvelle ligne qui vient juste de s'écrire dans le fichier log quand je dis "Oui" à la question "Voulez-vous faire une nouvelle sauvegarde ?" ( c'est pour avoir une sorte de confirmation de sauvegarde en montrant l'heure)

4. Est-ce que le chemin absolu est vraiment dérangeant (dans cette situation) dans la mesure où le lanceur lance le script (dans un terminal virtuel ?) à partir de mon répertoire personnel /home/toto/ et que le répertoire "log/" qui contient le fichier "madate2" se trouve au même endroit ?

Hors ligne

#6 22-08-2022 23:03:16

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : script bash boite de dialogue Zenity

Le point d'exclamation inverse la condition.

Pour "exit 1", c'est le code retour du script. C'est une indication au choix du programmeur.
Tu peux donc tester la réussite ou non du script par exemple.

Pour var3, ce n'est pas normal. tail -n1 te renverra toujours la dernière ligne du fichier.

Pour les chemins absolus, c'est juste une assurance que tu vas chercher les fichiers au bon endroit. Ça évite des surprises voire des incompréhensions de résultat.

Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#7 22-08-2022 23:55:55

totoZero7
Membre
Distrib. : Debian 11 bullseye
Noyau : 5.10.0-16-amd64
(G)UI : Mate 1.24.1
Inscription : 05-07-2020

Re : script bash boite de dialogue Zenity

Tawal a écrit :

Le point d'exclamation inverse la condition.

je ne comprends pas. C'est possible de la traduire en une phrase avec un exemple ?

Pour var3 il y a bien un problème.
N'y aurait-il pas un délais entre l’exécution de echo pour écrire dans le fichier, et la lecture de cette même ligne avec var3, qui se chevaucherait ?

Hors ligne

#8 23-08-2022 01:31:16

totoZero7
Membre
Distrib. : Debian 11 bullseye
Noyau : 5.10.0-16-amd64
(G)UI : Mate 1.24.1
Inscription : 05-07-2020

Re : script bash boite de dialogue Zenity

ahh j'ai capté pourquoi la var3 ne fonctionne pas, parce qu'elle est déclarée avant de faire la nouvelle vérification, du coup elle garde l'ancienne valeur ; et du reste, elle ne sert à rien car elle fait doublon avec var1.
Il faut donc déclarer var3 comme une nouvelle variable après avoir lancé echo
Du coup, on ne peut pas préparer les variables en amont. Faut tout faire au fur à mesure.

# ===============
# Début de script
# ===============
# On déclare les variables:
# -------------------------
dir=$(pwd)
var1=$(tail -n1 log/madate2)        # Retourne la dernière date de sauvegarde effectuée écrite dans le fichier log madate2
var2=$(date +"%a %d %B %Y - %Hh%M:%S")    # Enregistre la date et l'heure actuelle dans le fichier madate2
#var3=$(tail -n1 log/madate2)       # Ne pas la mettre ici
var4=$var1

# =============================
# Paragraphe Boite de dialogue:
# =============================
if ! zenity --info --width=350 --text="Bonjour, ma position est:\n$dir"
then
    exit 1
fi

if zenity --question --width=350 --text="La dernière sauvegarde remonte à :\n$var1\n\nVoulez-vous faire une nouvelle sauvegarde ?"
then
  echo "$var2" >> log/madate2
  var3=$(tail -n1 log/madate2)        # Affiche la dernière date ajoutée
    zenity  --info --width=350  --text="C'est bon!\nDernière sauvegarde correctement effectuée le:\n\nAncienne\nvar4 = $var4\n\nNouvelle\nvar3 = $var3"
else
    zenity  --info --width=200  --text="PAS sauvegardé\n"
fi

Hors ligne

#9 23-08-2022 06:27:34

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : script bash boite de dialogue Zenity

Un if else se construit de cette façon algorithmique :
si CONDITION alors ... sinon
Donc un
if ! condition
then
   ...
fi

veut dire : si PAS CONDITION alors ...
Edit:
C'est là, que sont importants les codes retour des commandes.
Si CONDITION est une commande (comme zenity dans le script ici) alors si le code retour est 0, la condition est vraie, toute autre valeur de code retour est considérée comme fausse.
Donc : if !zenity ... veut dire : si zenity ne réussit pas alors ...
Car quand tu cliques sur la croix de fermeture de la fenêtre zenity, celle-ci renvoie un code retour de 1.
Fin Edit.

De plus :

var3=$(tail -n1 log/madate2)

n'affiche pas la dernière ligne.
Mais affecte la dernière ligne à la variable var3.
var3 est le nom de la variable, $var3 est le contenu de la variable.

Dernière modification par Tawal (23-08-2022 06:33:06)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#10 23-08-2022 16:00:11

totoZero7
Membre
Distrib. : Debian 11 bullseye
Noyau : 5.10.0-16-amd64
(G)UI : Mate 1.24.1
Inscription : 05-07-2020

Re : script bash boite de dialogue Zenity

Tawal a écrit :

var3=$(tail -n1 log/madate2)
n'affiche pas la dernière ligne.
Mais affecte la dernière ligne à la variable var3.
var3 est le nom de la variable, $var3 est le contenu de la variable.


Ok, c'est du blabla plus précis que ce que je dis, mais mon raisonnement est juste ? (cela dit, j'aime le blabla précis big_smile)

Si je veux dire à var3 d'aller chercher la dernière ligne (nouvellement inscrite) du fichier ET que ma var3 soit déclarée en amont avec les autres au début.
Est-il possible, par une pirouette techique, fait en amont aussi lors de sa déclaration avec les autres, que cette var3 aille chercher cette nouvelle ligne et non celle d'avant l'écriture ?

Hors ligne

#11 23-08-2022 16:21:42

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : script bash boite de dialogue Zenity

Réfléchis à ce que tu dis !

Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

Pied de page des forums