Petit script shell exécution bizarre
gerard
-
gerard -
gerard -
Bonjour,
imaginez 4 fichiers vides f1 f2 f3 f4 et le script shell suivant:
le script alea.sh choisi un nombre aléatoire entre 1 et 4 et je tape ça dans mon shell:
./script.sh toto & ./script.sh titi &, donc 2 scripts en parallèle. Quelqu'un saurait me dire pourquoi rien ne s'écrit dans aucun fichier alors que je vérifie bien au départ qu'ils sont tous vides?
merci
imaginez 4 fichiers vides f1 f2 f3 f4 et le script shell suivant:
for i in 1 2 do var='./alea.sh' if [ -z f$var ] then echo $1 > f$var fi done
le script alea.sh choisi un nombre aléatoire entre 1 et 4 et je tape ça dans mon shell:
./script.sh toto & ./script.sh titi &, donc 2 scripts en parallèle. Quelqu'un saurait me dire pourquoi rien ne s'écrit dans aucun fichier alors que je vérifie bien au départ qu'ils sont tous vides?
merci
A voir également:
- Petit script shell exécution bizarre
- Classic shell - Télécharger - Personnalisation
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Trier du plus petit au plus grand excel - Guide
9 réponses
essai en mettant "set +C" au début de ton script. Si ça ne fonctionne pas, c'est que ton if est mal écrit (rajoute un echo pour être sur que tu passes dedans).
je ne vois pas ta réponse snipeur...bon je crois qu'il y a eu un bug je voyais une réponse de ta part mais apparemment non
je ne vois aucune erreur dans mon if snipeur donc...et je ne comprends pas pq je ne passerai pas dans le if :-)
zipe: merci mais ça ne change pas grand chose, c'est sympa de m'aider mais es tu certain de faire du sh car tes réponses parfois me paraissent étranges comparées aux réponses de ceux qui connaissent le langage ( prends le pas mal ).
zipe: merci mais ça ne change pas grand chose, c'est sympa de m'aider mais es tu certain de faire du sh car tes réponses parfois me paraissent étranges comparées aux réponses de ceux qui connaissent le langage ( prends le pas mal ).
Je pense que zipe se débrouille très bien. Il me semble qu'il m'a déjà aider une fois ou deux.
Bref, tu n'as pas répondu, as tu essayé en mettant "set +C" ?
Le echo, c'est pour être sur, des fois, on ne voi pas les erreurs, mais elle y sont bien.
je pense que :
echo $1 >> f${var}
correspondrait mieux à ton problème.
Bref, tu n'as pas répondu, as tu essayé en mettant "set +C" ?
Le echo, c'est pour être sur, des fois, on ne voi pas les erreurs, mais elle y sont bien.
je pense que :
echo $1 >> f${var}
correspondrait mieux à ton problème.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Lances ton script en mode débogage, autrement dit rajoutes "set -xv" après le shebang, et affiches-nous le résultat.
hum...
http://unixhelp.ed.ac.uk/CGI/man-cgi?test
ton problème viens bien du if...
-z STRING
the length of STRING is zero
Essai :
if [ -z $(cat f$var) ]
http://unixhelp.ed.ac.uk/CGI/man-cgi?test
ton problème viens bien du if...
-z STRING
the length of STRING is zero
Essai :
if [ -z $(cat f$var) ]
for i in 1 2 do var='./alea.sh' if [ -z f$var ] then echo $1 > f$var fi done + for i in 1 2 for i in 1 2 do var='./alea.sh' if [ -z f$var ] then echo $1 > f$var fi done + for i in 1 2 ./alea.sh ++ ./alea.sh ./alea.sh ++ ./alea.sh + var=3 + '[' -z f3 ']' + for i in 1 2 + var=4 + '[' -z f4 ']' + for i in 1 2 ./alea.sh ++ ./alea.sh ./alea.sh ++ ./alea.sh + var=2 + '[' -z f2 ']' + var=4 + '[' -z f4 ']'
voila pour zipe, mais pour snipeur c'est pas possible que la chaine vaut 0 car comme tu le vois j'ai bien mes f2 f3...dans l'exécution au dessus.
tu comprends vite, mais faut expliquer longtemps...
ton script dit :
si la chaine de caractère est vide, alors mettre le premier argument dans le fichier de la chaine caractère.
J'espère qu'en plus tu apprécies le non sens du truc.
En plus, comme tu le dit, il n'est pas possible que ta chaine soit nulle (d'où en plus le désinteret total de faire un test sur un résultat que tu connais).
Pour finir c'est le fichier qui est vide, pas la chaine !
On aurait gagner du temps si comme je te l'avais dit tu avais mis un echo. Tu te serais alors apperçut que tu ne rentrai pas dans la boucle.
Ce que prouve d'ailleurs ton debug !
ton script dit :
si la chaine de caractère est vide, alors mettre le premier argument dans le fichier de la chaine caractère.
J'espère qu'en plus tu apprécies le non sens du truc.
En plus, comme tu le dit, il n'est pas possible que ta chaine soit nulle (d'où en plus le désinteret total de faire un test sur un résultat que tu connais).
Pour finir c'est le fichier qui est vide, pas la chaine !
On aurait gagner du temps si comme je te l'avais dit tu avais mis un echo. Tu te serais alors apperçut que tu ne rentrai pas dans la boucle.
Ce que prouve d'ailleurs ton debug !
attends zipe le -z sert bien à tester si un fichier est vide?
Car j'avais testé avec ! -z et tout marchait bien mais le ! -z teste: si le fichier n'est pas vide alors on écrit dedans, non? Comme à la base ils sont tous vides le ! -z est censé ne pas marché, bizarre...
Car j'avais testé avec ! -z et tout marchait bien mais le ! -z teste: si le fichier n'est pas vide alors on écrit dedans, non? Comme à la base ils sont tous vides le ! -z est censé ne pas marché, bizarre...
bon merci ça ira je pense pouvoir finaliser le truc tout seul, juste une question :
imaginez un lockfile toto.verrou juste avant le var=... et un rm -f toto.verrou juste après le fi, ça nous assure bien qu'un processus n'écrasera pas la valeur d'un autre mais en faisant un set -x j'ai 2 lockfile toto.verrou, c'est bizarre car une fois qu' un verrou est crée l'autre processus ne peut l'ouvrir tant que le rm -f sur le verrou n'a pas été exécuté...
imaginez un lockfile toto.verrou juste avant le var=... et un rm -f toto.verrou juste après le fi, ça nous assure bien qu'un processus n'écrasera pas la valeur d'un autre mais en faisant un set -x j'ai 2 lockfile toto.verrou, c'est bizarre car une fois qu' un verrou est crée l'autre processus ne peut l'ouvrir tant que le rm -f sur le verrou n'a pas été exécuté...