Bienvenue visiteur (Inscription |  Connexion)
Qui est en ligne ?
Il y a : 30 utilisateurs en ligne, consultez le détail
Auteur Message
Azollyx
#0 Message posté le : 01-06-2007 à 23:19:21


Naboo


Forum : Modérateur
Association : Président
Arrivé(e) le : 09-04-2006
Nombre de messages : 2379
Bonsoir tlm,
j'ai un petit problème en Bash :
CAN_OVERRIDE=

function can_override_test() {

	CAN_OVERRIDE=can

	${RSYNC} -r ${*} | while read line; do

		date=$(date -d "$(echo $line | cut -f 3,4 -d \ )" +%s)

		test $date -ge ${LAST_SYNC} && (

			CAN_OVERRIDE=cannot

			echo $line 1>&2

		)

	done

	echo "${CAN_OVERRIDE}" # <- tjr "can"

}

En fait, la modification de CAN_OVERRIDE ne tient pas, elle reprend sa valeur "can" au niveau du echo (alors que je suis bien passé dans l'alternative et qu'elle a bien été modifée). Je ne vois pas comment contourner ce problème.
J'ai essayer de virer les parenthèses mais rien. Je me demande si ça ne vient pas du pipe. Exporter la variable n'y fait rien non plus.
Avez-vous des idées de la manière que je pourrais utiliser pour contourner ce problème ? J'aimerais éviter le fichier...

-------------------------------------
Tu as envie de t'impliquer ? Avec ton aide et tes compétences (je te vois, sourire... tu te sous-estimes !) nous pourrons bâtir la communauté Trustonme.
Tu ne sais pas par où commencer ? Viens faire un tour dans la catégorie Association Trustonme.
Azollyx
#1 Message posté le : 01-06-2007 à 23:56:33


Naboo


Forum : Modérateur
Association : Président
Arrivé(e) le : 09-04-2006
Nombre de messages : 2379
En attendant mieux, j'ai résolu le problème comme ceci :
CAN_OVERRIDE=

function can_override_test() {

	CAN_OVERRIDE=can

	CAN_OVERRIDE_FTMP=`mktemp`

	${RSYNC} -r ${*} | while test "${CAN_OVERRIDE}" != "${BREAKER}" && read line; do

		date=$(date -d "$(echo $line | cut -f 3,4 -d \ )" +%s)

		test $date -ge ${LAST_SYNC} &&

			rm -f "${CAN_OVERRIDE_FTMP}" &&

			CAN_OVERRIDE=cannot &&

			echo $line 1>&2

	done

	test -f "${CAN_OVERRIDE_FTMP}" && rm -f "${CAN_OVERRIDE_FTMP}" || CAN_OVERRIDE=cannot

}


-------------------------------------
Tu as envie de t'impliquer ? Avec ton aide et tes compétences (je te vois, sourire... tu te sous-estimes !) nous pourrons bâtir la communauté Trustonme.
Tu ne sais pas par où commencer ? Viens faire un tour dans la catégorie Association Trustonme.
Azollyx
#2 Message posté le : 31-05-2009 à 21:02:38


Naboo


Forum : Modérateur
Association : Président
Arrivé(e) le : 09-04-2006
Nombre de messages : 2379
Je viens de retomber sur ce post par hazard.
Pour l'info, c'était bien le pipe qui posait le soucis : il entraîne la création d'un sous-shell, tout comme les parenthèses. J'aurais pû supprimer le pipe en redirigeant la sortie de rsync dans un fichier puis en utilisant ce fichier comme entrée du while :
...
rsync... > monfichier
while...; do...
done < monfichier

Cela fait perdre le parallèlisme. Pour le retrouver, on pourrait utiliser des tubes nommés ou d'autres formes de redirections et lancer rsync tache de fond ; le while doit, lui, absolument rester dans le même process que le script, sinon il ne pourra pas modifier de variables.

--Message édité par Azollyx le 31-05-2009 à 21:03:42--


-------------------------------------
Tu as envie de t'impliquer ? Avec ton aide et tes compétences (je te vois, sourire... tu te sous-estimes !) nous pourrons bâtir la communauté Trustonme.
Tu ne sais pas par où commencer ? Viens faire un tour dans la catégorie Association Trustonme.