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] Problème avec paramètres dans variables


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2002
    Messages : 19
    Points : 14
    Points
    14
    Par défaut [Bash] Problème avec paramètres dans variables
    Salut à tous,

    Je suis en train de programmer un script pour encoder des vidéos via Handbrake. J'ai un problème car mon script ne fonctionne pas lorsque j'appelle l'application avec les paramètres en variable.

    Exemple :
    • si je lance l'application avec cette ligne :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      /Applications/HandBrakeCLI $config_video_defaut $config_video_x264 --audio $audio --aencoder $aencoder --mixdown $mixdown -i "$i"  -o "${i%.*}.m4v"
      alors, les paramètres ne sont pas pris en compte (ou pas tous en tout cas, c'est assez bizarre)
    • si je fais un echo de la ligne de lancement de l'application et que je la copie / colle dans un shell, l'application de lance correctement (en rajoutant des backslashs pour les -i et -0


    J'avoue avoir chercher un moment et ne trouve vraiment pas de pistes... Votre aide est la bienvenue.

    Merci d'avance ;-)

    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
     
    #!/bin/bash
     
    #
    # Liste des presets : https://trac.handbrake.fr/wiki/BuiltInPresets
    #
     
    type="$1"
    dossiersource="$2"
    #IFS=$'\n'
     
    config_video_defaut=" -t 1 -e x264 -q 19.25 -B 160,160 -f mp4 -R Auto,Auto -D 0.0,0.0 -m -2 --turbo --subtitle scan,1-9 --subtitle-burn --subtitle-forced scan --native-language fre"
     
    if [ $type == "film" ]; then
    	config_video_x264=" --detelecine --decomb --loose-anamorphic -x b-adapt=2:rc-lookahead=50"
    elif [ $type == "anime" ]; then
        config_video_x264=" --strict-anamorphic -x ref=1:weightp=1:subq=2:rc-lookahead=10:trellis=0:8x8dct=0"
    fi
     
    #for i in `find $2 -type f -name "*.mkv"`  
    find $2 -type f -name "*.mkv" | while read fichiers; do
     
    		#Nombre de piste audio + type (vérification seulement si 5.1)
    		tracks=`echo '' | /Applications/HandBrakeCLI -t 0 -i "$fichiers" 2>&1|grep "Audio:"|wc -l`
    		if [ $tracks -eq "1" ]; then
    			audio="1"
    		elif [ $tracks -eq "2" ]; then
    			audio="1,2"
    		elif [ $tracks -eq "3" ]; then
    			audio="1,2,3"
    		fi
     
    		#Si pas de 5.1, converti sinon copie
    		audio_type=`echo '' | /Applications/HandBrakeCLI -t 0 -i "$fichiers" 2>&1|grep "5.1 ch"|wc -l`
    		if [ $audio_type -eq "0" ]; then
    			aencoder="ca_aac"
    			audio_type_ch=`echo '' | /Applications/HandBrakeCLI -t 0 -i "$fichiers" 2>&1|grep "1.0 ch"|wc -l`
    			if [ $audio_type_ch -eq "0" ]; then	
    				mixdown="stereo"
    			else
    				mixdown="mono"
    			fi
    		else
    			aencoder="copy"
    			mixdown="auto"
    		fi
     
    		#Lancement de handbrake
    		echo '' | /Applications/HandBrakeCLI $config_video_defaut $config_video_x264 --audio $audio --aencoder $aencoder --mixdown $mixdown -i "$fichiers" -o "${fichiers%.*}.m4v"
     
     
    done

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

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

    un problème d'emplacement :
    • /Applications/ est à la racine du système de fichier de la distribution que tu utilises ?
    • depuis où est lancé ton script ?


    Hors-Sujet :
    ne modifie pas l'IFS, et utilise une boucle while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... | while read fic; do...done
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    while read fic; do ...; done < <(find ...)

    readonly ? dans un script ? c'est plutôt pour les variables d'environnement du shell interactif, qui, elles, pourraient être écrasées par une manipulation de l'utilisateur.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2002
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Oui, l'emplacement est correct et le lancement également. (Je suis sous MAC ce qui explique le /Applications/).

    Voici une commande que j'ai obtenue via un echo. Cette commande, si je la lance, s'exécute correctement.

    Par contre, si j'exécute cette commande directement depuis le script (je reste au même endroit), les paramètres ne fonctionnent pas. Je vois ceci par exemple avec le paramètre des sous-titre -> scan qui ne se fait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /Applications/HandBrakeCLI  -t 1 -e x264 -q 19.25 -B 160,160 -f mp4 -R Auto,Auto -D 0.0,0.0 -m -2 --turbo --subtitle scan,1-9 --subtitle-burn --subtitle-forced scan --native-language fre  --strict-anamorphic -x ref=1:weightp=1:subq=2:rc-lookahead=10:trellis=0:8x8dct=0  --audio 1,2 --aencoder ca_aac --mixdown mono  -i "./Rip//v1.mkv" -o "./Rip//v1.m4v"
    Je vais essayer de changer la boucle comme tu me l'as dit.
    -> J'ai essayé avec "find $2 -type f -name "*.mkv" | while read i;" mais du coup, il ne m'affiche plus que quelques fichiers qui font partie du dossier si je fais un echo $i juste après. Ce qui est bizarre car la commande find marche...
    -> J'ai remarqué que lorsque je laisse les lignes suivantes, ceci fait que mon do ne traite plus que 3 fichiers sur tous ceux disponibles
    #AUDIO_TYPE_CH=`/Applications/HandBrakeCLI -t 0 -i "$fichiers" 2>&1|grep "1.0 ch"|wc -l`
    #AUDIO_TRACKS=`/Applications/HandBrakeCLI -t 0 -i "$fichiers" 2>&1|grep "Audio:"|wc -l`
    -> J'ai "corrigé" ce point de la manière suivante :
    audio_type=`echo '' | /Applications/HandBrakeCLI -t 0 -i "$fichiers" 2>&1|grep "5.1 ch"|wc -l`



    Le changement IFS, c'était pour éviter le problème du find avec des dossiers qui ont des espaces.

    Le readonly, c'est un test. Je voulais être sûr que mes variables ne bougent pas jusqu'à l'exécution.

    Merci pour la réponse.

    Edit : J'ai réussi à faire fonctionner le script mais je ne sais pas vraiment pourquoi... J'ai du rajouter des echo '' | (j ai modifié le script du post original)

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bisol Voir le message
    Le changement IFS, c'était pour éviter le problème du find avec des dossiers qui ont des espaces.
    Salut
    Justement le principe du ... | while read var est là pour régler ce soucis. Le read se calant sur le <line feed> et non sur l'espace, t'es certain que ta variable contiendra toute une ligne entière.

    Toutefois je vais modérer l'intervention de N_Bah. T'as tout à fait le droit de modifier ponctuellement l'IFS pour un besoin précis. Mais faut vraiment être hyper rigoureux et bien penser à le sauvegarder pour le restaurer immédiatement dès que tu n'en as plus besoin.
    Exemple: traiter les dossiers du PATH un par un
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/bin/bash
    old="$IFS"
    IFS=":"
    set $PATH
    IFS="$old"    # Dès que je n'en ai plus besoin
     
    # Ici, tes variables $1, $2, $3 contiennent les différents dossiers
    for dir in $*
    do
       ...
    done

    Citation Envoyé par bisol Voir le message
    Edit : J'ai réussi à faire fonctionner le script mais je ne sais pas vraiment pourquoi... J'ai du rajouter des echo '' | (j ai modifié le script du post original)
    Pas normal sauf si la commande attend une validation initiale (style "appuyez sur <entrée> pour démarrer"). Faut se méfier des bricolages car cela peut reporter et amplifier le soucis...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2002
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Effectivement, ceci fonctionne parfaitement.

    J'ai trouvé plusieurs posts sur le net qui précisent que ce programme a besoin d'un echo '' afin d'éviter des problèmes de process (child / parents). Je ne sais pas exactement pourquoi mais l'essentiel c'est que ca passe et que la solution est propre vu que cette méthode est connue.

    Merci à vous !

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bisol Voir le message
    ...et que la solution est propre vu que cette méthode est connue.
    Exact. Heureux d'avoir pu aider à résoudre ton pb.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [Bash] Problème avec locate dans un script
    Par kopros2 dans le forum Administration système
    Réponses: 2
    Dernier message: 07/12/2011, 07h06
  2. problème avec espace dans variable
    Par REMACC1 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 18/08/2009, 10h47
  3. Problème avec paramètre date dans Crystal Report
    Par callo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/10/2008, 18h44
  4. [ADO] Problème avec LIKE dans requête paramétrée
    Par _skip dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 04/11/2007, 20h53
  5. Problème avec paramètres dans un <messagebundle>
    Par imagine64 dans le forum JSF
    Réponses: 6
    Dernier message: 12/02/2007, 17h27

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