112 votes

Désactiver une variable en lecture seule en bash

Comment annuler la définition d'une variable en lecture seule dans Bash ?

$ readonly PI=3.14

$ unset PI
bash: PI: readonly variable

ou ce n'est pas possible ?

7voto

Kevin Points 23308

Selon la page de manuel :

   unset [-fv] [name ...]
          ...   Read-only  variables  may  not  be
          unset. ...

Si vous n'avez pas encore exporté la variable, vous pouvez utiliser exec "$0" "$@" pour redémarrer votre shell, bien sûr vous perdrez aussi toutes les autres variables non exportées. Il semble que si vous démarrez un nouveau shell sans exec il perd sa propriété de lecture seule pour ce shell.

5voto

user1089933 Points 77

En particulier en ce qui concerne la variable TMOUT. Une autre option si gdb n'est pas disponible est de copier bash dans votre répertoire personnel et de modifier la chaîne TMOUT dans le binaire en quelque chose d'autre, par exemple XMOUX. Exécutez ensuite cette couche supplémentaire de shell et vous ne serez pas interrompu.

4voto

jezzaaaa Points 91
$ PI=3.17
$ export PI
$ readonly PI
$ echo $PI
3.17
$ PI=3.14
-bash: PI: readonly variable
$ echo $PI
3.17

Que faire maintenant ?

$ exec $BASH
$ echo $PI
3.17
$ PI=3.14
$ echo $PI
3.14
$

Un subshell peut hériter des variables du parent, mais n'héritera pas de leur statut protégé.

3voto

Amit Points 9307

La commande readonly la rend définitive et permanente jusqu'à ce que le processus shell se termine. Si vous devez modifier une variable, ne la marquez pas en lecture seule.

3voto

Joseph Sible Points 7272

Une alternative si gdb n'est pas disponible : Vous pouvez utiliser le site enable commande pour charger un module personnalisé qui vous permettra de désactiver l'attribut "lecture seule". L'essentiel du code qui le fait :

SETVARATTR (find_variable ("TMOUT"), att_readonly, 1);

Évidemment, vous remplacerez TMOUT avec la variable qui vous intéresse.

Si vous ne voulez pas transformer cela en un buildin vous-même, j'ai bifurqué de bash dans GitHub et ajouté un buildin entièrement écrit et prêt à compiler appelé readwrite . L'engagement est à https://github.com/josephcsible/bash/commit/bcec716f4ca958e9c55a976050947d2327bcc195 . Si vous voulez l'utiliser, récupérez les sources de Bash avec mon commit, exécutez ./configure && make && make loadables pour le construire, puis enable -f examples/loadables/readwrite readwrite pour l'ajouter à votre session de course, puis readwrite TMOUT pour l'utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X