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)

3 réponses

1 2
Avatar
Stephane Chazelas
2005-04-6, 16:48(+00), 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}"
[...]


Vu qu'il y a un "s" a "options", une variable scalaire ne
convient pas evidemment, il faut une liste.

options=(--titi "$fichier")
cmd "$options[@]"

Sinon:

options_shell_code='--titi "$fichier"'

eval "cmd $options_shell_code"

Sinon,
find | read

ne convient pas puisqu'on ne peut pas recuperer les fichiers de
maniere sure une fois qu'ils ont ete concatenés par find (a
moins d'utiliser -print0 mais alors, il faut... zsh qui est le
seul shell a savoir manipuler le caractere NUL)

Ou alors, il faut faire

NL='
'
find .//. -type f -print | {
IFS= read -r file
while [ -n "$file" ]; do
while IFS= read -r more; do
case $more in
*//*) break;;
esac
file=$file$NL$more
done
file=${file#.//}
do-something-with "$file"
file=$more
done
}

Ce qui n'est pas exactement "trivial", en tous cas moins que:

for file (./**/*(.ND)) do-some-thing-with "$file"

(qui a par contre l'inconvenient d'etre potentiellement gourmant
en resource, car il contruit et trie et stocke la liste complete
en memoire avant de la processer)

Enfin, ne pas oublier

find . -type f -exec do-something-with '{}' ;

--
Stéphane



Avatar
Stephane Chazelas
2005-04-6, 22:37(+01), Stephane Chazelas:
2005-04-6, 16:48(+00), 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}"
[...]


Vu qu'il y a un "s" a "options", une variable scalaire ne
convient pas evidemment, il faut une liste.
[...]


Ou alors:

options="'-titi' ${(q)fichier}"
cmd "${(Q@)${(z)options}}"

C'est a dire quoter $fichier grace a (q), parser les quotes
grace a (z) et les enlever grace a (Q).

--
Stéphane




Avatar
Stephane Chazelas
2005-04-6, 19:47(+00), 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.


Sauf si $fichier est vide (qui ne fait pas de sens pour un
fichier, mais peut dans d'autres circonstances).

Sinon, evidemment, sans ambiguité, il y a:

option="--titi=$fichier"
cmd "$option"

--
Stéphane


1 2