Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/09/2015, à 19: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, à 19:53)

Hors ligne

#2 Le 17/09/2015, à 20: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, à 20: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 smile ) 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, à 21: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, à 21:06)

Hors ligne

#5 Le 17/09/2015, à 21: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, à 21: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, à 21:26)

Hors ligne

#7 Le 17/09/2015, à 21:15

slash-z

Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)

nany a écrit :

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. smile

Hors ligne

#8 Le 17/09/2015, à 21: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 ! smile

Hors ligne

#9 Le 17/09/2015, à 21:46

nany

Re : [bash2] protéger une fonction en écriture avec typeset (ou declare)

slash-z a écrit :

Oui. Mais c'est justement ce que je voulais éviter. smile

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.


slash-z a écrit :

@nany,
j'aime bien le nom de ta machine, je veux le même ! smile

C’est sous copyright et le prix de la licence est exorbitant. tongue

Hors ligne

#10 Le 18/09/2015, à 06: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