OVH Cloud OVH Cloud

affectation de variable

13 réponses
Avatar
Rakotomandimby (R12y) Mihamina
Bonjour,

J'ai le script ci dessous, qui, quand je l'execute, me renvoie les
erreurs:

ERROR: Failed to open input file: No such file or directory
ERROR: Cannot open input file " --downmix --resample 5512 -q 1 -o /home/mihamina/little/kar3/aina_pazzapa/aina_pazzapa_never_change.ogg - ": No such file or directory
ERROR: Cannot open input file " --downmix --resample 5512 -q 1 -o /home/mihamina/little/kar3/Aline_raelisoa/125_aline_raelisoa.ogg - ": No such file or directory

Le problème c'est que j'ai l'affectation de variable :

[...]
ENCODER_OPTIONS=" --downmix --resample 5512 -q 1 -o ${NEWNAME} - "
[...]

et le shell tente d'executer la chaine de caractère, en remplaçant
NEWNAME par le path du fichier.

le vrai problème c'est qu'il tente d'éxécuter ce qu'il y a entre
guillemets. Pourquoi?

Voici le script

#!/bin/zsh

BASEP=${HOME}/music/
TARGETP=${HOME}/little/
mkdir -pv $TARGETP
ENCODER=oggenc
DECODER=oggdec
DECODER_OPTIONS=" -o - "
for FICHIER in ${BASEP}**/*.ogg(.ND); do
{
cd $FICHIER:h
NEWNAME=`print $FICHIER | sed 's/music/little/g'`
mkdir -pv $NEWNAME:h
ENCODER_OPTIONS=" --downmix --resample 5512 -q 1 -o ${NEWNAME} - "
$DECODER $DECODER_OPTIONS | $ENCODER $ENCODER_OPTIONS
}


--
Les serveurs avec 10Mb/s se louent maintenant pour 50 ou 60 Euros par mois!
La preuve http://www.google.fr/search?q=serveur+dedie
Infogerance de serveur dedie http://aspo.rktmb.org/activites/infogerance
(En louant les services de l'ASPO vous luttez contre la fracture numerique)

10 réponses

1 2
Avatar
Laurent Wacrenier
Rakotomandimby (R12y) Mihamina écrit:
J'ai le script ci dessous, qui, quand je l'execute, me renvoie les
erreurs:

ERROR: Failed to open input file: No such file or directory
ERROR: Cannot open input file " --downmix --resample 5512 -q 1 -o /home/mihamina/little/kar3/aina_pazzapa/aina_pazzapa_never_change.ogg - ": No such file or directory
ERROR: Cannot open input file " --downmix --resample 5512 -q 1 -o /home/mihamina/little/kar3/Aline_raelisoa/125_aline_raelisoa.ogg - ": No such file or directory

Le problème c'est que j'ai l'affectation de variable :

[...]
ENCODER_OPTIONS=" --downmix --resample 5512 -q 1 -o ${NEWNAME} - "
[...]

et le shell tente d'executer la chaine de caractère, en remplaçant
NEWNAME par le path du fichier.


Pas compris. Ça a l'air d'être un effet de l'absence de SH_WORD_SPLIT

le vrai problème c'est qu'il tente d'éxécuter ce qu'il y a entre
guillemets. Pourquoi?


Le "print|sed" est inutile et aléatoire de toute manière,

Voici le script

#!/bin/zsh

BASEP=${HOME}/music/
TARGETP=${HOME}/little/
mkdir -pv $TARGETP
ENCODER=oggenc
DECODER=oggdec
DECODER_OPTIONS=" -o - "
for FICHIER in ${BASEP}**/*.ogg(.ND); do
{
cd $FICHIER:h
NEWNAME=`print $FICHIER | sed 's/music/little/g'`
mkdir -pv $NEWNAME:h
ENCODER_OPTIONS=" --downmix --resample 5512 -q 1 -o ${NEWNAME} - "
$DECODER $DECODER_OPTIONS | $ENCODER $ENCODER_OPTIONS
}


Il y aura moins d'erreur de cette manière,

cd $BASEP
for FICHIER in **/*.ogg(.ND); do
NEWNAME=${TARGETP}/${FICHIER}
mkdir -pv $NEWNAME:h
ENCODER_OPTIONS=" --downmix --resample 5512 -q 1 -o ${NEWNAME} -
(cd $FICHIER:h
$DECODER $DECODER_OPTIONS ) |
$ENCODER $ENCODER_OPTIONS
done

Mais bon, il en reste surement encore.
Mieux vaut utiliser "sh" et un bon vieux "find | while read"
et virer toutes ces variables constantes et à usage unique.

Avatar
Nicolas George
R12y wrote in message :
#!/bin/zsh


Compare ces trois scripts :

#!/bin/zsh
a="foo bar baz"
for i in $a; do
echo $i
done

#!/bin/sh
a="foo bar baz"
for i in $a; do
echo $i
done

#!/bin/zsh
a=(foo bar baz)
for i in $a; do
echo $i
done

Ça devrait te donner la réponse.

Avatar
Nicolas George
Laurent Wacrenier wrote in message
:
Mieux vaut utiliser "sh" et un bon vieux "find | while read"


C'est infiniment plus lourd à faire fiablement qu'utiliser le glob de zsh :
il faut jouer avec IFS pour avoir un découpage aussi fiable, en particulier.

et virer toutes ces variables constantes et à usage unique.


C'est au contraire une bonne pratique que d'avoir tous les paramètres du
script regroupés à un endroit facilement modifiable sans risquer de tout
casser. Ça améliore la lisibilité et la maintenabilité.

Avatar
Rakotomandimby (R12y) Mihamina
( Wed, 06 Apr 2005 15:29:54 +0000 ) Laurent Wacrenier :

Il y aura moins d'erreur de cette manière,
[...]
NEWNAME=${TARGETP}/${FICHIER}
[...]


Non là ça passera pas.
C'est pour ça que j'ai dû faire le "print| sed",
sinon je me retrouve trop en profondeur.

Mais bon, il en reste surement encore.
Mieux vaut utiliser "sh" et un bon vieux "find | while read"
et virer toutes ces variables constantes et à usage unique.


Non. Je suis sur une machine de test, et l'arborescence est légèrement
différente sur la machine sur laquelle le script devra vraiment tourner.
De plus ce n'est que le début du script, j'ai du arreter le developpement
parceque je bloquait, mais ces variables me seront encore utiles.

Si ce truc devait s'arreter là, je l'aurais fait en interactif :-)

Mais merci pour tes conseils, ça prouve que tu cherche à en donner de
bons, puisque tu vas jusqu'à analyser le code de celui qui demande de
l'aide ;-).

--
Les serveurs avec 10Mb/s se louent maintenant pour 50 ou 60 Euros par mois!
La preuve http://www.google.fr/search?q=serveur+dedie
Infogerance de serveur dedie http://aspo.rktmb.org/activites/infogerance
(En louant les services de l'ASPO vous luttez contre la fracture numerique)

Avatar
Laurent Wacrenier
Nicolas George <nicolas$ écrit:
Mieux vaut utiliser "sh" et un bon vieux "find | while read"


C'est infiniment plus lourd à faire fiablement qu'utiliser le glob de zsh :
il faut jouer avec IFS pour avoir un découpage aussi fiable, en particulier.


Mais à part les passages à la ligne dans les noms des fichiers, ça ne
craint pas grand chose.

et virer toutes ces variables constantes et à usage unique.


C'est au contraire une bonne pratique que d'avoir tous les paramètres du
script regroupés à un endroit facilement modifiable sans risquer de tout
casser. Ça améliore la lisibilité et la maintenabilité.


C'est contradictioire, on ne peut pas stocker des noms de fichier dans
une variable scalaire et demander plus tard de découper cette
variable.

En plus, les variables sont éparpillées dans le script.


Avatar
Laurent Wacrenier
Rakotomandimby (R12y) Mihamina écrit:
Il y aura moins d'erreur de cette manière,
[...]
NEWNAME=${TARGETP}/${FICHIER}
[...]


Non là ça passera pas.


Ben si.
Il y a un "cd" avant la boucle.


Avatar
Nicolas George
Laurent Wacrenier wrote in message
:
C'est contradictioire, on ne peut pas stocker des noms de fichier dans
une variable scalaire et demander plus tard de découper cette
variable.


Avec zsh, si, on peut, justement.

Avatar
Rakotomandimby (R12y) Mihamina
( Wed, 06 Apr 2005 16:24:12 +0000 ) Laurent Wacrenier :

Il y a un "cd" avant la boucle.


Pfff. Mal lu. Désolé. Merci.
Bon je recode... au moins je suis sûr que je vais plus vite que les devs
du Hurd ;-) quite à tout reprendre à chaque fois... :-)

--
Les serveurs avec 10Mb/s se louent maintenant pour 50 ou 60 Euros par mois!
La preuve http://www.google.fr/search?q=serveur+dedie
Infogerance de serveur dedie http://aspo.rktmb.org/activites/infogerance
(En louant les services de l'ASPO vous luttez contre la fracture numerique)

Avatar
Laurent Wacrenier
Nicolas George <nicolas$ écrit:
Laurent Wacrenier wrote in message
:
C'est contradictioire, on ne peut pas stocker des noms de fichier dans
une variable scalaire et demander plus tard de découper cette
variable.


Avec zsh, si, on peut, justement.


On peut quoi ?
Si le fichier s'appele "foo bar" et tu fais

options="--titi ${fichier}"

comment c'est sensé marcher ?


Avatar
Nicolas George
Laurent Wacrenier wrote in message
:
On peut quoi ?


Ça, précisément.

Si le fichier s'appele "foo bar" et tu fais

options="--titi ${fichier}"


Je fais « options=(--titi $fichier) », tout simplement. Ça marche fiablement
et sans surprises.

1 2