在bash中取消设置只读variables

如何取消设置Bash中的只读variables?

$ readonly PI=3.14 $ unset PI bash: PI: readonly variable 

或者是不可能的?

其实, 你可以取消一个只读variables 。 但我必须警告,这是一个黑客的方法。 添加这个答案,只是作为信息,而不是推荐。 使用风险自负。 testing在Ubuntu 13.04,bash 4.2.45。

这种方法涉及知道一些bash源代码,它从这个答案inheritance。

 $ readonly PI=3.14 $ unset PI -bash: unset: PI: cannot unset: readonly variable $ cat << EOF| sudo gdb attach $$ call unbind_variable("PI") detach EOF $ echo $PI $ 

我尝试了上面的gdb hack,因为我想解除TMOUT(禁用自动注销),但是在TMOUT设置为只读的机器上,我不允许使用sudo。 但是因为我拥有bash过程,所以我不需要sudo。 但是,语法并不适用于我所在的机器。

但是,这工作(我把它放在我的.bashrc文件中):

 # Disable the stupid auto-logout unset TMOUT > /dev/null 2>&1 if [ $? -ne 0 ]; then gdb <<EOF > /dev/null 2>&1 attach $$ call unbind_variable("TMOUT") detach quit EOF fi 

根据手册页:

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

如果你还没有导出variables,你可以使用exec "$@"重新启动你的shell,当然你也会失去所有其他未导出的variables。 看起来,如果你没有exec情况下启动一个新的shell,它会失去它的只读属性。

不,不在当前shell中。 如果你想给它赋一个新的值,你将不得不fork一个新的shell,它将有一个新的含义,不会被认为是read only

 $ { ( readonly pi=3.14; echo $pi ); pi=400; echo $pi; unset pi; echo [$pi]; } 3.14 400 [] 

你不能,从unset手册页面:

对于每个名称,删除相应的variables或函数。 如果没有提供选项,或者给出了-v选项,则每个名称都指向一个shellvariables。 只读variables可能不会被取消设置。 如果指定了-f,则每个名称都指向一个shell函数,并删除函数定义。 每个未设置的variables或函数都从传递给后续命令的环境中删除。 如果RANDOM,SECONDS,LINENO,HISTCMD,FUNCNAME,GROUPS或DIRSTACK中的任何一个未被设置,则即使它们随后被重置,它们也将失去其特殊属性。 退出状态是正确的,除非名称是只读的。

只读命令使其最终和永久,直到shell进程终止。 如果您需要更改variables,请不要将其标记为只读。

特别是关于TMOUTvariables。 如果gdb不可用,另一个选项是将bash复制到主目录,并将二进制文件中的TMOUTstring打补丁,例如XMOUX。 然后运行这个额外的shell层,你不会超时。

在zsh中,

 $ typeset +r PI 

(是的,我知道这个问题是bash,但是当你使用Google for zsh时,你也会遇到一些bash问题。)