[Shell] Problème script dans script

Problème script dans script [Shell] - Shell/Batch - Programmation

Marsh Posté le 10-11-2012 à 20:20:11    

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?

Reply

Marsh Posté le 10-11-2012 à 20:20:11   

Reply

Marsh Posté le 10-11-2012 à 20:50:50    

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 ?

Reply

Marsh Posté le 10-11-2012 à 22:14:28    

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

Reply

Marsh Posté le 10-11-2012 à 23:23:04    

"$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 {} \;

Reply

Marsh Posté le 11-11-2012 à 10:45:01    

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)

Reply

Marsh Posté le 11-11-2012 à 13:27:07    

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) ?

Reply

Marsh Posté le 11-11-2012 à 22:28:31    

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
Reply

Marsh Posté le 12-11-2012 à 22:58:32    

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.
Reply

Marsh Posté le 12-11-2012 à 23:14:23    

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!

Reply

Marsh Posté le 12-11-2012 à 23:21:20    

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...

Reply

Marsh Posté le 12-11-2012 à 23:21:20   

Reply

Marsh Posté le 12-11-2012 à 23:29:45    

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

Reply

Marsh Posté le 13-11-2012 à 08:41:18    

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  :??:

Reply

Marsh Posté le 17-11-2012 à 13:20:32    

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

Reply

Marsh Posté le 04-01-2013 à 17:33:39    

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
Reply

Marsh Posté le 04-01-2013 à 20:43:34    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed