Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/10/2011, à 22:36

Tomzz

Zenity comportement étrange depuis Oneiric

Bonjour,
Il s'agit peut-être d'une mauvaise pratique de ma part mais depuis un moment je fais ça :

zenity --question --timeout="20" --text="blablabla" || exit 0

Jusqu’à présent le exit 0, grâce a || ne s’exécutait que si je ne cliquais pas sur OK.
En cliquant sur OK le script poursuivait en ignorant exit 0

Mais voila, depuis ma migration sous Oneiric le exit 0 est exécuté quelque soit le bouton de sortie de Zenity.

Quelqu'un a une idée ou au moins une alternative qui m'évite une panoplie de variables et de if ?

Hors ligne

#2 Le 16/10/2011, à 23:03

sputnick

Re : Zenity comportement étrange depuis Oneiric

Tu ne peut pas utiliser 

--timeout="20"

dans ce contexte.

Si tu a vraiment besoin d'un timeout, tu peut faite comme ça :

timeout 20 zenity --question --text="blablabla" || exit 0

(installer timeout si besoin)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#3 Le 16/10/2011, à 23:13

Tomzz

Re : Zenity comportement étrange depuis Oneiric

Merci, je teste.
Mais c'est nouveau ce problème de timeout?
Parce que je fais ça depuis 9.04 et j'ai teste sur toutes les versions, il n'y a que depuis 11.10 que mon script ne marche plus.

[edit] Ok, ça marche... merci (un fois de plus wink )

Le paquet timeout est indiquée comme obsolète mais la commande est intégrée dans coreutil donc a priori installé par défaut partout.
Sais tu depuis quelle version c'est le cas car mon script est sensé tourner sur toutes versions depuis 10.4

Dernière modification par Tomzz (Le 16/10/2011, à 23:25)

Hors ligne

#4 Le 11/11/2011, à 23:28

Tomzz

Re : Zenity comportement étrange depuis Oneiric

Bonjour,
Bon, je me retrouve avec un petit problème lié à ce problème de timeout.

J'utilise zenity avec des timeout dans plusieurs script que j'ai placés sur un dépôt.

Ces scripts étant de simple bash il fonctionnent depuis au moins 9.04 sans que j'ai a gérer des versions différentes.

Mais maintenant, ce timeout m’empêche d'assurer cette compatibilité multi version:

zenity --question --timeout="20" --text="blablabla" || exit 0

ne marche plus depuis Onieric.

timeout 20 zenity --question --text="blablabla" || exit 0

Marche partout mais sur 10.04 (11.04 ? ) je dois avoir installé le paquet timeout.

Mais sous Oneiric, ce paquet timeout n'existe plus et la commande est incluse dans coreutil.

Je me trouve donc avec un problème pour la gestion des dépendances:

- sous 10.04 je dois avoir le paquet timeout installée.
- sous 11.10 si j'ai timeout en dépendance je ne peux pas installer mon paquet car le paquet timeout n'existe pas et j'ai donc une erreur.

Y a t'il une solution pour créer des dépendances "conditionnelles".

Ou

Quelle est la meilleure méthode pour savoir si la commande timeout existe (la commande pas le paquet) de façon à faire ce test au lancement de mon script et donc de proposer l'installation du paquet timeout le cas échéant.

Hors ligne

#5 Le 12/11/2011, à 20:48

Tomzz

Re : Zenity comportement étrange depuis Oneiric

Bonjour,
Je m'en sort en mettant ça au début de mes scripts:

## Verification de la presence du paquet timeout
timeout 2 echo "a"
if [ $? != "0" ]; then
    {
        zenity --question --ok-label="Installer" --text="Le paquet Timeout n'est pas installé sur votre système\nVoulez-vous l'installer maintenant?." && tmo="oui"
        
        if [ "${tmo}" == "oui" ]; then
            {
                grep $(ls -i /var/lib/dpkg/lock | awk '{print $1}') /proc/locks >> /dev/null
                if [[ $? == 0 ]]; then
                    {
                        while true
                        do
                            zenity --question --text="Un autre gestionnaire de paquet est ouvert.\nVeuillez le fermer avant de cliquer sur OK." || break
                            grep $(ls -i /var/lib/dpkg/lock | awk '{print $1}') /proc/locks >> /dev/null
                            if [[ $? != 0 ]]; then
                                {
                                    xterm -title 'label' -e "\
                                    echo -e \"\E[37;44m\033[1m $(echo 'Veuillez saisir votre mot de passe d\047administrateur') \033[0m\"
                                    eval $(echo 'sudo apt-get install timeout')"
                                    break
                                }
                            fi
                        done
                    }
                else
                    {
                        xterm -title 'label' -e "\
                        echo -e \"\E[37;44m\033[1m $(echo 'Veuillez saisir votre mot de passe d\047administrateur') \033[0m\"
                        eval $(echo 'sudo apt-get install timeout')"
                    }
                fi
            }
        fi
    }
fi 

Une partie de la solution m'a été donnée ici.

Dernière modification par Tomzz (Le 12/11/2011, à 22:41)

Hors ligne

#6 Le 14/11/2011, à 13:54

sputnick

Re : Zenity comportement étrange depuis Oneiric


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 14/11/2011, à 14:28

sputnick

Re : Zenity comportement étrange depuis Oneiric

Il est aussi possible de re-ecrire timeout dans une fonction :

#!/bin/bash
# codé par sputnick 20111114

mytimeout() {
    tim=$1
    comm="$(cut -d' ' -f2- <<< $@)"

    bash -c "$comm" & _timeout_pid=$!
    while ((tim > 0)); do
        kill &>/dev/null -0 $_timeout_pid || return 0
        ((tim--))
        sleep 1
    done

    kill $_timeout_pid
    return 1
}    

mytimeout 3 find / &>/dev/null

Sinon, pour tester la présence d'une commande, au lieu de

timeout 2 echo "a"

tu peut ecrire

if type &>/dev/null timeout; then echo "present"; else echo "absent"; fi

Ensuite, ce code

                grep $(ls -i /var/lib/dpkg/lock | awk '{print $1}') /proc/locks >> /dev/null
                if [[ $? == 0 ]]; then

pourrait être simplifié en

if grep &>/dev/null $(ls -i /var/lib/dpkg/lock | cut -d' ' -f1)  /proc/locks; then

(awk est plus lourd que cut et on peut simplifier tes 2 instructions en une seule grâce au fait que toute commande Linux renvoi true ou false (0 ou != 0) )


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne