#1 Le 17/09/2015, à 18:50
- slash-z
[bash2] protéger une fonction en écriture avec typeset (ou declare)
$ cat ./test.sh
#!/bin/bash
my_toto () { echo "bash2 mon ami"; }
typeset -fr my_toto
my_toto
my_toto () { echo "bash2 mon faux-ami"; }
my_toto
$ ./test.sh
bash2 mon ami
./test.sh: ligne 8: my_toto : fonction en lecture seule
bash2 mon ami
Impeccable, c'est le résultat attendu.
Maintenant:
$ cat ./test.sh
#!/bin/bash
my_toto () { echo "bash2 mon ami"; }
typeset -frx my_toto
./test2.sh
et
$ cat ./test2.sh
#!/bin/bash
my_toto
my_toto () { echo "bash2 mon faux-ami"; }
my_toto
et enfin:
$ ./test.sh
bash2 mon ami
bash2 mon faux-ami
Raté !!!
Dommage, la fonction exportée n'est donc protégée en écriture qu'au sein du script où elle est typesetée.
Ça limite un peu l'intérêt du typeset -r
Le résultat est identique avec une variable (classique).
Fonctionnalité ou bug ?
Dernière modification par slash-z (Le 17/09/2015, à 18:53)
Hors ligne
#2 Le 17/09/2015, à 19:42
- pingouinux
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
Bonjour,
Je constate effectivement la même chose que toi, et je l'ignorais. Ce n'est finalement pas anormal : dans test2.sh, tu ne récupères qu'une copie d'une fonction ou d'une variable exportée dans test.sh, et aucune modification ne pourra remonter. C'est la variable originale qui est protégée en écriture, et non sa copie.
Hors ligne
#3 Le 17/09/2015, à 19:48
- slash-z
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
Je n'ai plus accès actuellement à une machine sous Unix (is not Linux ) mais je serais curieux de voir si le comportement est le même en ksh. Si quelqu'un pouvait vérifier, merci ?
Hors ligne
#4 Le 17/09/2015, à 20:00
- slash-z
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
@pingouinux,
Oui tu as raison, c'est donc dans la logique de bash.
Cela dit, je me souviens qu'en ksh, je pouvais faire du
echo "toto" | read var; echo $var # affiche "toto"
sans souci alors que cela ne fonctionne pas en bash (l'environnement du père ne peut être modifié etc). J'ai mis longtemps à perdre cette habitude.
D'où ma question du post précédent, est-ce que le résultat est identique en ksh. Je soupçonne que non. A vérifier par curiosité.
NB: la facilité du "tube read" ne fonctionnnait pas non pius en zsh à l'époque où je l'avais testé. Zsh qui est sensé être un clone libre de ksh.
Dernière modification par slash-z (Le 17/09/2015, à 20:06)
Hors ligne
#5 Le 17/09/2015, à 20:12
- nany
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
Bonjour,
je ne peux pas tester non plus en ksh.
Mais en revanche ;
nany@stupidcomputer:~$ cat test.sh
#!/bin/bash
my_toto () { echo "bash2 mon ami"; }
typeset -frx my_toto
nany@stupidcomputer:~$ cat test2.sh
#!/bin/bash
. ./test.sh
my_toto
my_toto () { echo "bash2 mon faux-ami"; }
my_toto
nany@stupidcomputer:~$ ./test2.sh
bash2 mon ami
./test2.sh: ligne 7: my_toto : fonction en lecture seule
bash2 mon ami
nany@stupidcomputer:~$
My two cents.
Hors ligne
#6 Le 17/09/2015, à 20:12
- pingouinux
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
Tu peux faire ceci, en bash
$ read var <<<"toto"; echo $var
toto
Ajouté :
Et même, dans ce cas précis :
var=toto
Dernière modification par pingouinux (Le 17/09/2015, à 20:26)
Hors ligne
#7 Le 17/09/2015, à 20:15
- slash-z
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
Bonjour,
je ne peux pas tester non plus en ksh.
Mais en revanche ;
nany@stupidcomputer:~$ cat test.sh #!/bin/bash my_toto () { echo "bash2 mon ami"; } typeset -frx my_toto
nany@stupidcomputer:~$ cat test2.sh #!/bin/bash . ./test.sh my_toto my_toto () { echo "bash2 mon faux-ami"; } my_toto
nany@stupidcomputer:~$ ./test2.sh bash2 mon ami ./test2.sh: ligne 7: my_toto : fonction en lecture seule bash2 mon ami nany@stupidcomputer:~$
My two cents.
Oui. Mais c'est justement ce que je voulais éviter.
Hors ligne
#8 Le 17/09/2015, à 20:31
- slash-z
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
@nany,
j'aime bien le nom de ta machine, je veux le même !
Hors ligne
#9 Le 17/09/2015, à 20:46
- nany
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
Oui. Mais c'est justement ce que je voulais éviter.
Je m’en doutais un peu. D’où le « my two cents ».
Et c’est vrai que ça serait intéressant de connaître le comportement en ksh.
@nany,
j'aime bien le nom de ta machine, je veux le même !
C’est sous copyright et le prix de la licence est exorbitant.
Hors ligne
#10 Le 18/09/2015, à 05:44
- pingouinux
Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)
Pour compléter mon message #6, voici une façon de lire en bash la première ligne du résultat d'une commande :
$ read var < <(echo -e "to to\nti ti"); echo "$var"
to to
et le résultat complet
$ var=$(echo -e "to to\nti ti"); echo "$var"
to to
ti ti
Hors ligne