Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2672 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell] Problème script dans script

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Shell] Problème script dans script

n°2163394
ganfoud
Talk to me Goose
Posté le 10-11-2012 à 20:20:11  profilanswer
 

Bonjour à tous
j'ai un problème et je suis en train de m'arracher les cheveux (déjà que j'en ai pas beaucoup!  :pt1cable: )
j'ai un script qui lance un autre script de cette façon:

Code :
  1. cat fichier.tmp | while read ligne
  2. do
  3.         film=$(/usr/bin/find ${VIDEO}/ -type f \( -iname "*.avi" -o -iname "*.mkv" -o -iname "*.mp4" \) | grep -F "${ligne}" )
  4.         if [ "${film}" != "" ]
  5.         then
  6.              script2.sh "${film}"
  7.         fi
  8. done


(fichier.tmp contient une liste de fichiers)
et quand je fais ça, le script2.sh ne se lance qu'une seule fois au lieu des x fois de la boucle! et sans message d'erreur...
si je fais dans le terminal un "for ligne in ligne1 ligne2 ..." ça marche
 
qu'est ce qui pourrait provoquer que la boucle while s'arrête après la première itération?? c'est possible que le script2.sh provoque ça?

mood
Publicité
Posté le 10-11-2012 à 20:20:11  profilanswer
 

n°2163397
Profil sup​primé
Posté le 10-11-2012 à 20:50:50  answer
 

Bonjour,
 
trop d'inconnues:
quel shell ?
le fichier.tmp a été créé sur Windows ?
comment est-il créé?
que fait script2.sh?
comment prend-il ses arguments ?

n°2163406
ganfoud
Talk to me Goose
Posté le 10-11-2012 à 22:14:28  profilanswer
 

c'est du bourne shell
non tout est sous linux, le début du premier script crée le fichier.tmp (qui s'appelle en fait video_list_recent.tmp) via

Code :
  1. find ${VIDEO}/ -mtime -5 -type f \( -iname "*.avi" -o -iname "*.mkv" -o -iname "*.mp4" \) > ${SCRIPT}/video_list_recent.tmp


en fait, tout ça sert à récupérer des sous titres de vidéos (premier script) et à les intégrer à la vidéo avec mkvmerge (script2)
pour être plus précis l'appel à script2.sh se fait en

Code :
  1. script2.sh -f "${film}"


t'entends quoi exactement par "comment prend-il ses arguments"?
 
je copie colle pas mes scripts directement, car ils sont assez longs!
 
en tout cas, merci pour ton aide

n°2163410
Profil sup​primé
Posté le 10-11-2012 à 23:23:04  answer
 

"$film" sera perçu par le script2 comme un seul argument, et j'avais l'impression que la variable aurait pu contenir plusieurs noms.
 
tu fait deux find:  
- un pour remplir un fichier temporaire
- un pour piper à grep un des noms trouvé par le premier find
?
 
tu ne peux pas ne faire qu'un seul find avec -exec ?

Code :
  1. /usr/bin/find ${VIDEO}/ -type f -iregex ".*\.\(avi\|mkv\|mp4\)$" \) -exec script2.sh -f {} \;

n°2163425
ganfoud
Talk to me Goose
Posté le 11-11-2012 à 10:45:01  profilanswer
 

je me suis trompé sur mon copier/coller de la commande qui crée le fichier .tmp  :pt1cable:  
c'est ça en fait :

Code :
  1. find ${VIDEO}/ -mmin -"$duree" -type f \( -iname "*.srt" -o -iname "*.ass" -o -iname "*.ssa" -o -iname "*.idx" \) > ${SCRIPT}/srt_list_recent.tmp


donc le find ne s'applique pas sur les même types de fichiers
en gros, la logique de mes scripts, ça donne
1. je cherche les videos qui ont moins de 5 jours,  
2. je cherche les sous titres pour ces vidéos,
3. j'ajoute les sous titres récupérés en 2. (d'où le find *.srt) aux vidéos correspondantes (-> find *.mkv | grep $titre)
d'ailleurs ça me fait penser que plutôt que faire un grep, je ferais peut être mieux de rajouter un " -iname "$titre" " dans mon find non?
 
(en effet, je ne suis pas programmeur de formation :P)

n°2163446
Profil sup​primé
Posté le 11-11-2012 à 13:27:07  answer
 

essayes comme ça:

Code :
  1. #!/bin/sh
  2. Videos="quelquepart"
  3. find "$Videos" -mmin... -iregex ".*.\(sst\|...\)" | while read sst;
  4. do
  5.    echo "trouvé: $sst"
  6.    path="${sst%/*}"
  7.    nomEText="${sst##*}"
  8.    nomF="${nomETtext%.*}"
  9.    find "$Videos" -iregex ".*$nomF.*\.\(ext1\|...\)" -exec chemin/script2.sh -f {} \;
  10. done


parce que je ne connais pas la structure de répertoire $Videos.
a-t-il des sous-répertoires, ou tous les fichiers ne sont que sur un seul niveau (au quel cas, une boucle for ferait aussi bien) ?

n°2163488
ganfoud
Talk to me Goose
Posté le 11-11-2012 à 22:28:31  profilanswer
 

non, il y a bien des sous répertoires dans $videos
je vais tester ta proposition!
 
edit: bon ben ça marche pas mieux...
en fait je suspecte un problème dans le script2.sh vu que sans l'option -f ça "marche" (càd que il se lance bien 2 fois, mais du coup, forcément, il ne déroule pas le même process sans l'option -f)

Message cité 1 fois
Message édité par ganfoud le 11-11-2012 à 23:54:14
n°2163667
Sve@r
Posté le 12-11-2012 à 22:58:32  profilanswer
 

ganfoud a écrit :

non, il y a bien des sous répertoires dans $videos
je vais tester ta proposition!
 
edit: bon ben ça marche pas mieux...
en fait je suspecte un problème dans le script2.sh vu que sans l'option -f ça "marche" (càd que il se lance bien 2 fois, mais du coup, forcément, il ne déroule pas le même process sans l'option -f)


 
Salut
Et t'as essayé de remplacer "script2.sh" par un simple "echo" ? Ou de mettre l'option "set -x" ? C'est quand-même la base du debug non ?
 
PS: test "var" != "" <=> test -n "$var"

Message cité 1 fois
Message édité par Sve@r le 12-11-2012 à 23:17:03

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°2163668
ganfoud
Talk to me Goose
Posté le 12-11-2012 à 23:14:23  profilanswer
 

Sve@r a écrit :


 
Et t'as essayé de remplacer "script2.sh" par un simple "echo" ?


bah oui bien sûr
en fait, j'ai continué à pousser les tests, et il semblerait que ce soit l'appel à mkvmerge dans mon script2.sh qui provoque le problème... si je le met en commentaire, ça passe toute les boucles  :pt1cable:  
la commande en question (peut varier selon les cas mais l'idée est la même) :

Code :
  1. mkvmerge -o ${VIDEO}/"$titre.tmp.mkv" "$1" --language 0:fre --track-name 0:French --default-track 0:yes --forced-track 0:no -s 0 -D -A -T --no-global-tags --no-chapters --sub-charset 0:"$fr_srt_type" "$fr_srt" --track-order 0:1,0:2,2:0,1:0


c'est possible que ce soit un bug de mkvmerge qui provoque ce genre de chose?  :??:  

Sve@r a écrit :

Ou de mettre l'option "set -x" ?


je ne sais pas ce que fait "set -x"   :(  

Sve@r a écrit :

PS: test "var" != "" <=> test -n "$var"


je ne savais pas!

n°2163669
Sve@r
Posté le 12-11-2012 à 23:21:20  profilanswer
 

ganfoud a écrit :

je ne sais pas ce que fait "set -x"   :(  


Ca active le mode "trace". Tout le code situé entre "set -x" et "set +x" est alors affiché lorsqu'il est exécuté (les variables sont remplacées par leur contenu).
 
Tu peux aussi appeler ton script en tapant "sh -x script". Ca lance alors le script dans un shell qui a l'option activée => chaque ligne du script est affichée au moment où elle s'exécute...

mood
Publicité
Posté le 12-11-2012 à 23:21:20  profilanswer
 

n°2163670
ganfoud
Talk to me Goose
Posté le 12-11-2012 à 23:29:45  profilanswer
 

ah super intéressant ça! c'est bon à savoir

n°2163693
ganfoud
Talk to me Goose
Posté le 13-11-2012 à 08:41:18  profilanswer
 

ah ben autre piste:
toujours dans mon script2.sh, j'ai ça:

Code :
  1. ssh root@192.168.0.100 'synoindex -d "$1"'
  2. ssh root@192.168.0.100 'synoindex -a "$fichier.mkv"'


et si je passe ces 2 lignes en commentaires, tout se déroule sans souci (même le mkvmerge précédent)  :pt1cable:  
 
tout ça me laisse perplexe  :??:

n°2164408
ganfoud
Talk to me Goose
Posté le 17-11-2012 à 13:20:32  profilanswer
 

bon j'ai trouvé, c'est bien la commande ssh qui posait problème:
en faisant un "ssh [...] &" ça marche!

n°2169904
Nukolau
Posté le 04-01-2013 à 17:33:39  profilanswer
 

Pour préciser, ca peux toujours servir :
Le SSH (tout comme le rsh d'ailleurs), prends l'entrée standard et la vide.
du coup, un code du style :

Code :
  1. cat fichier | while read ligne
  2. do
  3. ssh serveur "$ligne"
  4. done


ne fera qu'une seule boucle car le ssh va "vider" le read.

 

Pour éviter ca, il faut ajouter l'option -n au ssh (ou au rsh). Extrait du man :

Citation :

-n   Redirects  stdin  from  /dev/null  (actually,  prevents
          reading from stdin).


Message édité par Nukolau le 04-01-2013 à 17:34:34
n°2169933
mrbebert
Posté le 04-01-2013 à 20:43:34  profilanswer
 

C'est bon à savoir :jap:  
Le genre de bug qu'on peut mettre un moment à comprendre :pt1cable:


---------------
Doucement le matin, pas trop vite le soir.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell] Problème script dans script

 

Sujets relatifs
Problème affichage tableau de taille variableProblème Connection MySQL sur mon VPS
probleme lecture swf flash cs6problème d'utilisation de variable shell dans un script
Script bash - Problème d'espace dans une variable RESOLU[Script Shell] Problème pour exécuter des commandes
[Shell] Petit probleme avec un scriptproblème script shell en bash!
SHELL/TCSH : Probleme sur un script automatiqueprobleme de script shell
Plus de sujets relatifs à : [Shell] Problème script dans script


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR