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 :

Coup de pouce lecture automatique de fichiers / boucle avec nom de fichiers


Sujet :

Shell et commandes GNU

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut Coup de pouce lecture automatique de fichiers / boucle avec nom de fichiers
    Salut à tous

    Bon je ne suis un cador du script bash.
    Je bloque sur une petite broutille :\

    J'ai adapté le script suivant pour tourner sur une raspbian elle-même sur un raspberry pi.
    L'objectif est de lancer la lecture via omxplayer d'un (ou plusieurs) morceau de musique ou une vidéo en boucle, les morceaux étant sur une clé usb.

    Mon problème actuellement :
    ça fonctionne... sauf si il y a des espaces dans le nom des fichiers.
    ça doit être une histoire de guillemets ou de parenthèses à remettre au bon endroit.
    Si qq'un voit comment résoudre ça je suis preneur ;o)

    a+
    Nicolas

    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
     
    #!/bin/sh
     
    # get rid of the cursor so we don't see it when videos are running
    setterm -cursor off
     
    # set here the path to the directory containing your videos
    VIDEOPATH="/home/pi/medias" 
     
    # you can normally leave this alone
    SERVICE="omxplayer"
     
    USBKEY="/media/$(ls -I SETTINGS /media)"
     
    # now for our infinite loop!
    while true; do
            if ps ax | grep -v grep | grep $SERVICE > /dev/null
    then
            sleep 1;
    else
    	for entry in $(ls "$USBKEY")
    do
    		clear
                    omxplayer -o local "$USBKEY/$entry" > /dev/null
    #		echo "$USBKEY/$entry"
            done
    fi
    done

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

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

    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    ni une boucle for pour parcourir une substitution de commande !
    une bouclefor itère sur chaque mot, et non sur chaque ligne.

    => remplace ta boucle for par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in /media/!(SETTINGS)
    en ayant ajouté au début du script cette option de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shopt -s extglob nullglob
    NB : un script bash doit commencer par un shebang bash : #!/bin/bash.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    Est-ce que tu peux m'expliquer pquoi stp ?

    ni une boucle for pour parcourir une substitution de commande !
    Est-ce que tu peux m'expliquer encore pquoi re-stp ?
    une bouclefor itère sur chaque mot, et non sur chaque ligne.

    => remplace ta boucle for par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in /media/!(SETTINGS)
    en ayant ajouté au début du script cette option de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shopt -s extglob nullglob
    NB : un script bash doit commencer par un shebang bash : #!/bin/bash.
    Bon je vais me replonger dans la doc pour reregarder la différence entre le bash et le sh :\ (edit : http://fr.wikipedia.org/wiki/Shell_Unix)
    Pour utiliser shopt il faut rebasculer en bash ou je peux rester avec /bin/sh ?

    Sinon pour ceux qui liront, utilisation de shopt dans le man bash

    Merci en tout cas
    Nicolas

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par nicolas.poulain Voir le message
    Pour utiliser shopt il faut rebasculer en bash ou je peux rester avec /bin/sh ?
    Il faut bash ;o) je confirme !

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    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
     
     
    #!/bin/bash
     
    # fixe les options de bash - voir man bash
    shopt -s extglob nullglob
     
    # get rid of the cursor so we don't see it when videos are running
    setterm -cursor off
     
    # you can normally leave this alone
    SERVICE="omxplayer"
     
    # now for our infinite loop!
    # permet de lire les fichiers sur une clé USB en excluant le dossier /media/SETTINGS
    while true; do
            if ps ax | grep -v grep | grep $SERVICE > /dev/null
    then
            sleep 1;
    else
            for file in /media/!(SETTINGS)/*
    do
                    clear
                    omxplayer -o local "$file" > /dev/null
    #               echo "$file"
            done
    fi
    done
    ça roule avec ça. En complément dans /etc/rc.local, un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bash /home/pi/monscript.sh
    Tu vois des choses encore à corriger ?

    En tout cas, bien merci
    Tu bascules en résolu quand tu as complété qques explications ?
    Nicolas

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    ls n'apporte rien à un script : un shell de base sait faire des développements de chemins; bash ajoute des extensions, activées par extglob
    quant à obtenir des informations sur les fichiers, il est préférable d'utiliser stat dont la sortie peut être formatée à souhait.

    pour la boucle for, j'ai expliqué que cela coupe les données en mots, non en lignes.

    si, selon toi, nous avons répondu à tes interrogations, tu peux mettre en résolu en appuyant le le bouton
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Citation Envoyé par nicolas.poulain Voir le message
    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
     
     
    #!/bin/bash
     
    # fixe les options de bash - voir man bash
    shopt -s extglob nullglob
     
    # get rid of the cursor so we don't see it when videos are running
    setterm -cursor off
     
    # you can normally leave this alone
    SERVICE="omxplayer"
     
    # now for our infinite loop!
    # permet de lire les fichiers sur une clé USB en excluant le dossier /media/SETTINGS
    while true; do
            if ps ax | grep -v grep | grep $SERVICE > /dev/null
    then
            sleep 1;
    else
            for file in /media/!(SETTINGS)/*
    do
                    clear
                    omxplayer -o local "$file" > /dev/null
    #               echo "$file"
            done
    fi
    done
    Alors, ici, on voit que l'on initialise une variable (SERVICE) et qu'elle est utilisée dans un cas pas très pratique, surtout qu'après elle n'est pas utilisée alors que cela aurait été bien utile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps ax | grep -v grep | grep $SERVICE > /dev/null
    pourrait être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps ax | grep -q '[o]mxplayer'
    Et pourquoi ne pas remplacer le bloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while true; do
            if ps ax | grep -v grep | grep $SERVICE > /dev/null
    then
            sleep 1;
    else
            for file in /media/!(SETTINGS)/*
    do
                    clear
                    omxplayer -o local "$file" > /dev/null
    #               echo "$file"
            done
    fi
    done
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while sleep 1; do
            ps ax | grep -q '[o]mxplayer' && continue
            for file in /media/!(SETTINGS)/*
            do
                    clear
                    omxplayer -o local "$file" > /dev/null
    #               echo "$file"
            done
    done
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    ps | grep : ps -C <commande>, ou pidof <commande>, ou encore pgrep <commande>
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    En fait, je me demande même si c'est utile le passage par une des forme de ps, puisque c'est le script lui-même qui lance omxplayer...
    Cordialement.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Re'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ps ax | grep -v grep | grep $SERVICE > /dev/null
    En fait, cette ligne de test (ou celle que tu proposes ;o) ), d'après ce que je comprends, ne sert que si une instance de omxplayer est déjà lancée en dehors de ce script.
    ça serait utile si on mettait la lecture en tâche de fond genre "omxplayer file &"
    Mais si de toute façon on attend la fin de chaque processus de lecture (comportement par défaut de omxplayer) pour passer à la suite au final, je ne suis pas très convaincu de sa présence.
    Pour le dire autrement on ne fait pas le test tant qu'on est dans la boucle du for. Et quand on est plus dans la boucle du for, c'est qu'il n'y plus de lecture de fichier.

    Je suis dans le vrai ou plutôt à côté ?

    Des fois est-ce qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    kill omxplayer
    while true ; do
            for file in /media/!(SETTINGS)/*
            do
                    clear
                    omxplayer -o local "$file" > /dev/null
            done
    done
    ne ferait pas le taf ?

    Nicolas

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

Discussions similaires

  1. [Débutant] boucle avec nom de fichier variable
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/05/2011, 18h53
  2. Réponses: 8
    Dernier message: 01/06/2010, 14h33
  3. Fichier batch et nom de fichier dynamique avec date
    Par ZIED dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 20/04/2009, 15h38
  4. Réponses: 1
    Dernier message: 27/01/2009, 21h28
  5. Boucle et nom de fichier
    Par Hitonari dans le forum C++
    Réponses: 9
    Dernier message: 10/06/2008, 18h40

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